我怀疑。我已经读过当我们想要等待特定函数来完成操作时使用await关键字。
public async void Work()
{
await SlowTask();
Console.WriteLine("Execution completed");
}
现在根据定义,当调用Work()方法时,它将等待SlowTask()方法在打印“执行完成”之前完成其执行。但我怀疑即使没有使用await和async关键字,那么Work()方法也会等待SlowTask()方法在打印“执行完成”之前完成执行,因为它将逐行执行。
答案 0 :(得分:5)
但是我怀疑即使没有使用await和async关键字,那么Work()方法也会等待SlowTask()方法在打印之前完成执行"执行完成"因为它将逐行执行。
如果您不使用await
,它将等待SlowTask
方法返回 - 但它不会等待< EM>完整。这是理解async / await最棘手的方面之一:async方法返回,只要它需要等待尚未完成的东西,但是当它完成时它会继续。< / p>
假设SlowTask
是:
async Task SlowTask()
{
Console.WriteLine("A");
await Task.Delay(5000);
Console.WriteLine("B");
await Task.Delay(5000);
Console.WriteLine("C");
}
此方法会在调用后立即打印A
,但在点击第一个await
时会返回,因为延迟赢得了#{1}}。已经完成了。如果您没有等待调用代码中的SlowTask
,那么您将会看到&#34;执行已完成&#34;即使SlowTask
还没有真正完成。
第一次延迟完成后,SlowTask
将恢复,B
将被打印。由于第二次延迟,它将再次返回(对于任何计划的延续),然后在完成之前继续并打印C
。如果您确实在等待SlowTask
返回的任务,当您看到&#34;执行已完成&#34;打印 - 这可能是你想要的。
答案 1 :(得分:0)
当我第一次了解时,有一件事总能帮助我们了解这种情况。
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");
}
如果你运行它,它将按顺序打印出步骤。因为在OtherMethodAsyncAsync中的await将控制权传递给调用方法,直到它等待完成为止。
在调用方法StartTaskAsync中,它不会立即等待,因此它可以继续运行某些代码,直到它等待OtherMethodAsyncAsync返回的任务为止。
如果你要使这个同步。即删除所有asyncs并等待,只返回void而不是task。您会看到步骤3在步骤2之前打印