【发布时间】:2016-12-02 15:43:53
【问题描述】:
我已经查看了多个关于 SO 的类似问题,但我仍然无法回答我自己的问题。
我有一个控制台应用程序(实际上是一个 Azure Webjob),它执行文件处理和数据库管理。一些大量数据从多个来源下载并在数据库中处理。
这是我的代码示例:
var dbLongIndpendentProcess = doProcesAsync();
var myfilesTasks = files.Select(file => Task.Run(
async () =>
{
// files processing
}
await myfilesTasks.WhenAll();
await dbLongIndpendentProcess;
// continue with other stuff;
一切正常,并符合我的预期。在整个过程中还有其他任务在运行,但我想从上面的代码中可以清楚地看到这个想法。
我的问题:这是解决这个问题的一种公平方式,还是我会通过执行良好的旧“手动”多线程来获得更多性能(或意义?)?我选择这种方法的主要原因是它简单明了。
但是,async/await 的主要目的不是为了不阻塞主 (UI) 线程而进行异步操作。在这里,我没有任何 UI,也没有做任何事情。事件驱动。
谢谢,
【问题讨论】:
-
您不需要立即
await调用,您可以触发一个任务,将其分配给一个变量,然后执行一些额外的工作并在稍后需要该值时等待该任务。例如,在厨房里,你会煮米饭,但你不会等锅烧开,而是先完成其他工作,然后再检查锅。就“手动”多线程而言,创建线程可能会很昂贵,尤其是如果您不知道自己在做什么,我个人认为这取决于您的偏好,尤其是工作的复杂性。 -
值得补充的是,您应该正确实现取消模式,因为您明确地处理长任务。
-
是的,长时间运行的任务应该有一个
CancellationToken,这样您就可以优雅地清理和释放资源,而不是简单地撕掉一个可能导致意外行为的Thread或Task。 -
@ColinM 请帮助我理解。 “你不需要立即等待调用,你可以触发一个任务,将它分配给一个变量,然后执行一些额外的工作,然后在需要值时等待任务。”这是一般性评论还是参考我的代码,在我看来,我正在这样做。还是我在这里遗漏了什么?
-
一般来说作为一个指针,因为很多人倾向于引入
async和await关键字,同时期望在真正执行操作时提高性能 异步。查看您的代码,您可以通过拆分操作并将其分配给dbLongIndependentProcess然后await稍后执行该任务来完成它。
标签: c# .net multithreading asynchronous async-await