异步/等待多核

时间:2014-08-31 12:11:23

标签: c# .net async-await

async / await是否应与线程一起使用才能使用多核?我理解async / await不完整,但看起来它没有创建新线程并且不使用线程池。因此它在当前线程上运行代码,这意味着没有多核支持。

4 个答案:

答案 0 :(得分:7)

async-await并不是关于跨多个核心的负载平衡工作。它是关于利用本质上异步的操作并释放资源来处理更多的工作。良好的异步API不使用额外的线程来执行工作。通常,There is no Thread,意味着代码将继续在同一个线程上执行,直到命中第一个await并将控制权交还给调用者。

您可以查看异步API的示例,例如HttpClientStreamWriterSmtpClient等。它们都通过网络处理工作(网络驱动程序调用,磁盘驱动器调用等) )。

如果您要查找的是并行处理,请查看Parallel类。

您也可以先阅读Parallel Programming in the .NET Framework

答案 1 :(得分:1)

根据MSDN

  

await运算符应用于异步方法中的任务,以暂停方法的执行,直到等待的任务完成。该任务代表了正在进行的工作。

这就是它的全部。它与线程根本没有任何关系。它将在同一个线程上开始执行其他操作,直到另一个任务(不是Task)完成。 async / await也将提高单核系统的性能。

答案 2 :(得分:0)

如果您尝试使用async / await,它将只启动一个新线程,但它不能用于在多个核心上运行某些东西。这项工作只是转移到另一个线程并释放当前线程。

你可以使用像PLINQ这样的东西来处理多个核心。

参考:Running Queries On Multi-Core Processors

答案 3 :(得分:0)

await强制非并行执行没有固有的东西。您可以轻松地启动多个任务,并行运行它们并立即等待它们。

await确保async方法在活动的环境同步上下文中运行。这通常会导致非并行执行。所有主流同步上下文都是非并行的。您可以使用Task.Run随意突破该限制。

也就是说,在GUI应用程序中,您不需要在UI线程上执行并行执行,因为您根本不应该在那里做很多工作。

在服务器应用程序中,同步上下文是每个请求的单线程 。这也是一个很好的默认值。不同的请求并行运行。

再次,你可以随意突破:

var t1 = Task.Run(...);
var t2 = Task.Run(...);
await t1;
await t2;

这是并行的。

var t1 = Task.Run(...);
await t1;
var t2 = Task.Run(...);
await t2;

这是连续运行的。