繁体   English   中英

我们还需要在 c# 中使用 await 吗?

[英]Do we still need to use await in c#?

await 运算符暂停对封闭 async 方法的评估,直到其操作数表示的异步操作完成

但根据这篇文章

//You can access the Result property of the task, 
//which will cause your thread to block until the result is available:

string code = GenerateCodeAsync().Result;

这是否意味着我们不再需要await 因为如果我们使用await ,我们必须将 function 更改为async ,这会使逻辑复杂化。 但是访问任务的结果属性不需要这个

更新

//code1
func1();
var r = asyncFunc().Result;
func2(); //thread block, func2 won't be called until asyncFunc completes.



//code2
func1();
await asyncFunc();
func2();  //will func2 be called immediately after "await asyncFunc()"?

100 倍是的 - await很重要。 .Result将阻塞调用线程,直到产生结果。 await允许运行时仅在需要时挂起和唤醒后续代码,而不阻塞任何线程。 实际上, await可以在完全不同的线程上唤醒。

一点历史花絮: Task<T>和它的.Result被添加为 C# 4.0 和任务并行库的一部分,早在asyncawait之前。

我认为 async/await 模式的一个常见误解是暂停执行 == 阻塞结果。 然而,这不是真的。 当您调用 await 时,您的程序实际上并没有停止执行,它会将线程推入等待队列,该队列将在 IO 完成后复活。 这允许其他任务同时运行。 虽然从技术上讲,您总是可以阻止结果并使用相同的代码 output,但使用 await,您的代码会运行得更快。

GenerateCodeAsync().Result在这种情况下只是从您的代码中删除异步。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM