如何同时执行多个异步任务

Jam*_*zba -1 c# asynchronous task

我对此代码感到困惑.根据包含此代码的文档,它会调用允许它们同时执行的每个任务,然后等待它们都完成.

我不明白执行的顺序是如何运作的.通过声明任务var firstTask = DoSomethingAsync();会导致任务开始执行吗?我认为没有await表达式它是同步的.

public async Task RunConcurrentTasks()
{
    var firstTask = DoSomethingAsync();
    var secondTask = DoSomethingElseAsync();

    await firstTask;
    await secondTask;
} 
Run Code Online (Sandbox Code Playgroud)

此外,此代码是否实现了相同的结果?

public async Task RunConcurrentTasks()
{
    var firstTask = DoSomethingAsync();
    var secondTask = DoSomethingElseAsync();

    await Task.WhenAll(firstTask, secondTask);
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 6

var firstTask = DoSomethingAsync(); 这会导致任务开始执行吗?

是.它更好!DoSomethingAsync在其名称中承诺以异步方式执行某些操作,因此如果它不会将执行任务交还给您,那么它的名称就是谎言.

然后执行如何前进到下一行来调用第二个任务?

我不明白这个问题.

我认为没有await表达式它是同步的.

你的信念是错误的."等待"并不意味着"使这种异步".等待既不创造也不破坏异步; 它只管理现有的异步.DoSomethingAsync已经的任何异步独立await.同样,它说它以异步方式执行某些操作,因此最好能做到这一点!

await在你的例子中只是return.这意味着"返回我的调用者,并在等待任务完成后的某个时间再次开始运行此方法." 这是异步等待.

想想await就像yield return.当你在一个迭代器块中并且遇到一个yield return时,该方法会返回,然后它会在将来某个时刻从中断处继续. await基本相同; 只是机制略有不同.

另一种思考方式是await标记一个点,在等待任务完成之前,当前方法无法继续运行.由于该方法无法继续运行,因此返回.

同样,对右侧的呼叫await没有任何作用.它只是一个运算符,它遵循运算符的所有常规规则:

await Foo();
Run Code Online (Sandbox Code Playgroud)

var blah = Foo();
await blah;
Run Code Online (Sandbox Code Playgroud)

是一样的,就像

var x = Foo() + Bar();
Run Code Online (Sandbox Code Playgroud)

var f = Foo(); 
var b = Bar(); 
var x = f + b;
Run Code Online (Sandbox Code Playgroud)

是一回事.Await不会为它的操作数做一些神奇的事情,而不仅仅是+对它的操作数有些神奇.这只是一种特殊的回报.

此外,这段代码是否做同样的事情?

请不要在一个问题中提出两个问题.如果您有两个问题,请发两个问题.

问题不明确.两个工作流的语义是RunConcurrentTasks返回的任务在其子任务完成时发出信号,如果这就是您所要求的.