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