【发布时间】:2019-09-19 12:53:12
【问题描述】:
我有一个关于异步编程的问题:
带有任务的异步代码(没有 async/await)和带有 async/await 的异步代码有什么区别?
在C#中,我们可以使用Task来编写异步代码或方法,也可以使用关键字。
带任务的异步代码(无 Async/Await)
static Task DoWorkAsync()
{
var work = Task.Run(() => { Thread.Sleep(5000); });
var workcompleted = work.ContinueWith((x) => { Console.WriteLine("Work Completed!!!"); });
return work;
}
带有 Async/Await 的异步代码
static async Task DoWorkAsync()
{
await Task.Run(() => { Thread.Sleep(10000); });
Console.WriteLine("Work Completed");
}
如果能回答我的问题,我真的很感激。
【问题讨论】:
-
您应该使用
await Task.Delay而不是Thread.Sleep和Task.Run。如果您进行了更改,您会发现第二个代码示例将比第一个更短/更简单。 -
异步方法旨在成为非阻塞操作。当等待的任务正在运行时,异步方法中的等待表达式不会阻塞当前线程。相反,表达式将方法的其余部分注册为延续,并将控制权返回给异步方法的调用者。
-
第一种方法不是异步的。如果您在控制台应用程序中同时运行这两种方法,您会注意到第一种方法会阻塞 UI,而第二种方法则不会
-
@apomene 这并不完全正确。这一切都取决于调用者对返回的任务做了什么。调用者可以使用
Wait来阻止代码中的任何一个,或者使用await来阻止任何一个。 -
async和await关键字让您可以通过编写一系列语句来执行异步代码,就像您编写同步代码时一样,即您可以在 @987654331 之后立即调用Console.WriteLine@ 不使用传递给ContinueWith的回调。它使您的异步代码看起来更干净。
标签: c# .net asynchronous async-await task