我只是想确保我很好地理解异步等待与Task.run或Task.whenall之间的区别
所以异步等待就是处理异步方法。这意味着暗含处理顺序。
我在不阻塞主线程的情况下进行了很长的处理,然后等待结果继续。
对于Task.Run和Task.Whenall,有一个新的多线程概念。这意味着我可以在一个新线程上启动一个长进程,而无需等待完成即可继续执行代码。该代码在新线程上。然后我可以在此线程上等待方法。
因此,如果我清楚理解的话,我决定对长进程使用异步等待,这意味着在主线程上执行顺序。
我将Task.run用于线程以并行运行并独立处理。
这是好方法吗,我的理解很好吗?
谢谢
答案 0 :(得分:1)
您对async
/ await
和Task.Run
的理解基本上是正确的。
Task.Run
使您可以轻松地在ThreadPool
线程上运行一些代码,并避免阻塞当前线程。创建多个Task
或使用Parallel
类使您可以利用多个CPU内核来更快地完成一些工作。
使用async
/ await
时,您可以在任务完成后做一些工作。由于await
之后的SynchronizationContext
代码可以在原始线程上执行,尽管并非总是如此。例如,控制台应用程序没有SynchronizationContext
。
要记住的重要一件事是async
/ await
对于I / O绑定工作非常有用,而Task.Run
对于CPU绑定工作很好。这背后的原因是,当您await
执行某些I / O绑定操作(例如通过网络发送数据)时,您不会在等待此类操作完成时浪费任何线程。您可以了解有关here的更多信息。
答案 1 :(得分:0)
是的,Task.Run
方法是一种将工作卸载到后台线程的简便方法。工作线程由ThreadPool
类提供。学习一些有关此类的知识是个好主意,知道池中的资源不足时会发生什么,以及如果您预计会发生这种情况(可以主动使用SetMinThreads
),该怎么办。
使用Task.Run
比直接使用Thread
实例更方便。任务具有强类型的Result
,具有Exception
属性,可以awaited异步,可以与其他任务combined并可以包含在其他任务中,并具有额外的功能功能(例如,将任务包装在cancelable wrapper中。