C# 任务延续使用异步/等待并行执行
在使用异步/await构造的控制台应用程序的上下文中,我想知道“continuations”是否可以在不同CPU上的多个线程上并行运行 我认为情况就是这样,因为continuations发布在默认的任务调度程序(console应用程序中没有SynchronizationContext)上,这是线程池 我知道async/await构造不会构造任何额外的线程。但是,线程池应该至少为每个CPU构造一个线程,因此,如果在线程池上发布延续,它可以在不同的CPU上并行调度任务延续。。。这就是我所想的,但由于某种原因,我昨天真的很困惑,我不再那么确定了 下面是一些简单的代码:C# 任务延续使用异步/等待并行执行,c#,multithreading,task-parallel-library,threadpool,async-await,C#,Multithreading,Task Parallel Library,Threadpool,Async Await,在使用异步/await构造的控制台应用程序的上下文中,我想知道“continuations”是否可以在不同CPU上的多个线程上并行运行 我认为情况就是这样,因为continuations发布在默认的任务调度程序(console应用程序中没有SynchronizationContext)上,这是线程池 我知道async/await构造不会构造任何额外的线程。但是,线程池应该至少为每个CPU构造一个线程,因此,如果在线程池上发布延续,它可以在不同的CPU上并行调度任务延续。。。这就是我所想的,但由于
public class AsyncTest
{
int i;
public async Task DoOpAsync()
{
await SomeOperationAsync();
// Does the following code continuation can run
// in parrallel ?
i++;
// some other continuation code ....
}
public void Start()
{
for (int i=0; i<1000; i++)
{ var _ = DoOpAsync(); } // dummy variable to bypass warning
}
}
公共类异步测试
{
int i;
公共异步任务DoOpAsync()
{
等待操作同步();
//以下代码是否可以继续运行
//在帕拉莱尔?
i++;
//其他一些延续代码。。。。
}
公开作废开始()
{
对于(int i=0;iYes),您应该在i++
周围放置线程同步逻辑,因为有可能多个线程在wait
之后同时执行代码
作为for循环的结果,将创建大量任务。这些任务将在不同的线程池线程上执行。一旦这些任务完成,将在不同的线程池线程上再次执行后续操作,即等待后的代码。这使得多个线程可能同时执行i++操作您的理解是正确的:在控制台应用程序中,默认情况下,由于默认的SynchronizationContext
,将继续调度到线程池
每个async
方法都是同步启动的,因此您的for
循环将在同一线程上执行DoOpAsync
的开始。假设SomeOperationAsync
返回一个不完整的任务,则将在线程池上安排继续
因此,DoOpAsync
的每一次调用都可以并行进行。你想让它们并行运行吗?如果你想,同步所有调用就很容易了,只需在Start
中等待DoOpAsync
。谢谢你的回答,Haris!谢谢Stephen的澄清:)