Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 任务延续使用异步/等待并行执行_C#_Multithreading_Task Parallel Library_Threadpool_Async Await - Fatal编程技术网

C# 任务延续使用异步/等待并行执行

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上并行调度任务延续。。。这就是我所想的,但由于

在使用异步/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的澄清:)