C# wait关键字在c语言中的使用#

C# wait关键字在c语言中的使用#,c#,asynchronous,async-await,C#,Asynchronous,Async Await,我有一个疑问。我已经读到,当我们想要等待一个特定函数完成操作时,使用wait关键字 public async void Work() { await SlowTask(); Console.WriteLine("Execution completed"); } 现在根据定义,当调用Work()方法时,它将等待SlowTask()方法完成其执行,然后再打印“executioncompleted”。但我怀疑,即使不使用wait和async关键字,Work()方法也会在打印“execution co

我有一个疑问。我已经读到,当我们想要等待一个特定函数完成操作时,使用wait关键字

public async void Work()
{
await SlowTask();
Console.WriteLine("Execution completed");
}
现在根据定义,当调用Work()方法时,它将等待SlowTask()方法完成其执行,然后再打印“executioncompleted”。但我怀疑,即使不使用wait和async关键字,Work()方法也会在打印“execution completed”之前等待SlowTask()方法完成其执行,因为它将逐行执行

但我怀疑,即使不使用wait和async关键字,Work()方法也会在打印“execution completed”之前等待SlowTask()方法完成其执行,因为它将逐行执行

如果不使用
wait
,它将等待
SlowTask
方法返回,但不会等待它完成。这是理解async/await最棘手的方面之一:async方法在需要等待尚未完成的内容时立即返回,但在完成后继续

因此,假设
SlowTask
是:

async Task SlowTask()
{
    Console.WriteLine("A");
    await Task.Delay(5000);
    Console.WriteLine("B");
    await Task.Delay(5000);
    Console.WriteLine("C");
}
此方法将在调用后立即打印
A
,但在到达第一个
wait
时返回,因为延迟尚未完成。如果您没有在调用代码中等待
SlowTask
,那么您将看到“执行已完成”,即使
SlowTask
尚未真正完成


第一次延迟完成后,
SlowTask
将恢复,并将打印
B
。由于第二次延迟,它将再次返回(到预定的继续),然后继续并在完成之前打印
C
。如果您确实在等待由
SlowTask
返回的任务,您将看到打印的“执行完成”——这可能是您想要的。

当我第一次了解这个场景时,有一件事总是有助于看到差异

Public async Task StartTaskAsync()
{
    Console.WriteLine("First Step");

    Task awaitableTask = OtherMethodAsync();

    Console.Writeline("Second step");
    await awaitableTask;
    Console.Writeline("4th Step");
}

Public async Task OtherMethodAsync()
{
    await Task.Delay(2000);
    Console.WriteLine("Step 3");
}
如果运行此命令,它将按顺序打印步骤。因为othermethodasync中的wait将控制权传递回调用方法,直到wait完成为止

在调用方法StartTaskAsync中,它不会立即等待,因此它可以继续运行一些代码,直到它等待OtherMethodAsync返回的任务


如果你让它同步。Ie删除所有异步和等待,只返回void而不是task。您会看到第3步打印在第2步之前

可能的副本,为了进一步澄清,我建议您阅读这篇文章。