async / await是否应与线程一起使用才能使用多核?我理解async / await不完整,但看起来它没有创建新线程并且不使用线程池。因此它在当前线程上运行代码,这意味着没有多核支持。
答案 0 :(得分:7)
async-await
并不是关于跨多个核心的负载平衡工作。它是关于利用本质上异步的操作并释放资源来处理更多的工作。良好的异步API不使用额外的线程来执行工作。通常,There is no Thread,意味着代码将继续在同一个线程上执行,直到命中第一个await
并将控制权交还给调用者。
您可以查看异步API的示例,例如HttpClient
,StreamWriter
,SmtpClient
等。它们都通过网络处理工作(网络驱动程序调用,磁盘驱动器调用等) )。
如果您要查找的是并行处理,请查看Parallel
类。
答案 1 :(得分:1)
根据MSDN:
await运算符应用于异步方法中的任务,以暂停方法的执行,直到等待的任务完成。该任务代表了正在进行的工作。
这就是它的全部。它与线程根本没有任何关系。它将在同一个线程上开始执行其他操作,直到另一个任务(不是Task
)完成。 async / await也将提高单核系统的性能。
答案 2 :(得分:0)
如果您尝试使用async / await,它将只启动一个新线程,但它不能用于在多个核心上运行某些东西。这项工作只是转移到另一个线程并释放当前线程。
你可以使用像PLINQ这样的东西来处理多个核心。
答案 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;
这是连续运行的。