c# - c#中await关键字的使用

标签 c# asynchronous async-await

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

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

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

最佳答案

But I have a doubt that even if the await and async keyword are not used then also Work() method is going to wait for SlowTask() method to complete its execution before printing "Execution completed" because it will be executed line by line.

如果您不使用 await,它将等待 SlowTask 方法返回 - 但它不会等待它完成。这是理解 async/await 最棘手的方面之一:异步方法返回,只要它需要等待尚未完成的事情,但它会在完成时继续。

所以假设 SlowTask 是:

async Task SlowTask()
{
    Console.WriteLine("A");
    await Task.Delay(5000);
    Console.WriteLine("B");
    await Task.Delay(5000);
    Console.WriteLine("C");
}

此方法将在调用后立即打印 A,但会在遇到第一个 await返回,因为延迟不会尚未完成。如果您不在调用代码中等待 SlowTask,那么即使 SlowTask 尚未真正完成,您也会看到“执行已完成”。

在第一个延迟完成后,SlowTask 将恢复,B 将被打印。由于第二次延迟,它将再次返回(无论计划继续),然后继续并在 完成 之前打印 C。如果您实际上已经等待了 SlowTask 返回的任务,那是,当您看到打印“执行完成”时 - 这可能是您想要的。

关于c# - c#中await关键字的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46872190/

相关文章:

c# - Entity Framework Core Fluent Modelbuilder 键和属性

firebase - 我可以在stream.map()中使用异步函数吗?

c# - 确定哪个任务已完成

c# - Async/Await 和 Dispatcher 之间的区别

javascript - 使两个网页相互来回通信的最佳方法是什么?

c# - 为什么属性中的异步/等待方法永远不会返回

c# - 日期时间-新的一天开始于 3 :00 am

c# - 我们可以用 C# 中的对象替换 if 语句吗

c# - 将 List<Entity1> 转换为另一个 List<Entity2>

c# - HttpListener 问题 : Each HTTP request results in two contexts returned by HttpListener