Arg*_*413 -1 .net c# asynchronous task async-await
我有一个关于异步编程的问题:
带任务的异步代码(不带异步/等待)和带异步/等待的异步代码有什么区别?
在C#中,我们可以使用Task来编写异步代码或方法,也可以使用关键字。
带任务的异步代码(无异步/等待)
static Task DoWorkAsync()
{
var work = Task.Run(() => { Thread.Sleep(5000); });
var workcompleted = work.ContinueWith((x) => { Console.WriteLine("Work Completed!!!"); });
return work;
}
Run Code Online (Sandbox Code Playgroud)
带有 Async/Await 的异步代码
static async Task DoWorkAsync()
{
await Task.Run(() => { Thread.Sleep(10000); });
Console.WriteLine("Work Completed");
}
Run Code Online (Sandbox Code Playgroud)
如果能回答我的问题,我真的很感激。
在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;
}
Run Code Online (Sandbox Code Playgroud)
ContinueWith上面的代码使用了具有危险默认行为的低级方法。具体来说,它将隐式捕获当前的TaskScheduler.
上面的代码返回一个Task当Task.Run委托完成时完成的。当该任务完成时,委托尚未运行,并且由于被ContinueWith忽略,workcompleted因此ContinueWith委托中的任何异常都将被丢弃。调用代码无法知道ContinueWith委托何时完成,或者是否成功完成。
async与/代码对比await,它更短、更清晰、更容易维护、更正确:
static async Task DoWorkAsync()
{
await Task.Run(() => { Thread.Sleep(10000); });
Console.WriteLine("Work Completed");
}
Run Code Online (Sandbox Code Playgroud)
上面的代码返回一个Task,当整个DoWorkAsync完成(包括WriteLine)时完成。任何异常都会被捕获并放置在任务中。
此外,更复杂的逻辑(例如循环和重试)可以更自然地使用async/来表达await,而不是使用手动管理的状态对象的延续。
在幕后,awaitinDoWorkAsync最终会调用ContinueWith。通过让编译器正确生成棘手的代码,您可以避开许多陷阱并最终得到更易于维护的代码。
| 归档时间: |
|
| 查看次数: |
144 次 |
| 最近记录: |