在使用async/await构造的控制台应用程序的上下文中,我想知道“延续”是否可以在不同 CPU 上的多个线程上并行运行。
我认为是这种情况,因为延续发布在默认任务调度程序(控制台应用程序中没有 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
}
}
SomeOperationAsync本身不会创建任何线程,为了示例的目的,假设它只是依赖 I/O 完成端口异步发送一些请求,因此根本不会阻塞任何线程。
现在,如果我调用将发出 1000 个异步操作的Start方法,是否可以在不同的 CPU 线程上并行运行异步方法的延续代码(在等待之后)?即在这种情况下我是否需要处理线程同步并同步对字段“i”的访问?