在c#中使用await关键字

时间:2017-10-22 08:51:49

标签: c# asynchronous async-await

我怀疑。我已经读过当我们想要等待特定函数来完成操作时使用await关键字。

public async void Work()
{
await SlowTask();
Console.WriteLine("Execution completed");
}

现在根据定义,当调用Work()方法时,它将等待SlowTask()方法在打印“执行完成”之前完成其执行。但我怀疑即使没有使用await和async关键字,那么Work()方法也会等待SlowTask()方法在打印“执行完成”之前完成执行,因为它将逐行执行。

2 个答案:

答案 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之前打印