Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用任务编写异步代码和使用异步等待编写异步代码之间的区别?_C#_.net_Asynchronous_Async Await_Task - Fatal编程技术网

C# 使用任务编写异步代码和使用异步等待编写异步代码之间的区别?

C# 使用任务编写异步代码和使用异步等待编写异步代码之间的区别?,c#,.net,asynchronous,async-await,task,C#,.net,Asynchronous,Async Await,Task,我有一个关于异步编程的问题: 带任务的异步代码(不带async/await)和带async/await的异步代码之间有什么区别 在C#中,我们可以使用Task编写异步代码或方法,也可以使用关键字 带任务的异步代码(不带异步/等待) 带有Async/Await的异步代码 static async Task DoWorkAsync() { await Task.Run(() => { Thread.Sleep(10000); }); Cons

我有一个关于异步编程的问题:

带任务的异步代码(不带async/await)和带async/await的异步代码之间有什么区别

在C#中,我们可以使用Task编写异步代码或方法,也可以使用关键字


带任务的异步代码(不带异步/等待)


带有Async/Await的异步代码

    static async Task DoWorkAsync()
    {
        await Task.Run(() => { Thread.Sleep(10000); });
        Console.WriteLine("Work Completed");
    }

如果你能回答我的问题,我真的很感激

在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;
}
上面的代码使用低级别的
ContinueWith
方法,该方法具有以下特性:。具体来说,它将隐式捕获当前的
任务调度器

上面的代码返回一个
任务
,该任务在
任务.Run
委托完成时完成。当任务完成时,
ContinueWith
委托尚未运行,并且由于忽略了
workcompleted
,因此,
ContinueWith
委托中的任何异常都将被丢弃。调用代码无法知道委托的
ContinueWith
何时完成,或者是否成功完成

async
/
await
代码相比,它更短、更清晰、更易于维护、更正确:

static async Task DoWorkAsync()
{
    await Task.Run(() => { Thread.Sleep(10000); });
    Console.WriteLine("Work Completed");
}
上面的代码返回一个
任务
,该任务在整个
doworksync
完成时完成(包括
WriteLine
)。捕获任何异常并将其放置在任务上

此外,更复杂的逻辑(如循环和重试)更自然地用
async
/
await
表示,而不是用手动管理的状态对象表示


在发动机罩下,
doworksync
中的
wait
将调用
ContinueWith
。通过让编译器正确地生成棘手的代码,您可以避开许多陷阱,最终得到更多可维护的代码。

您可以使用
等待任务。延迟
而不是
线程。睡眠
任务。运行
。如果进行了更改,您会发现第二个代码示例将比第一个代码示例短得多/简单得多。异步方法旨在实现非阻塞操作。异步方法中的等待表达式不会在等待的任务运行时阻塞当前线程。相反,表达式将该方法的其余部分注册为延续,并将控制权返回给异步方法的调用方。第一个方法不是异步的。如果在控制台应用程序中同时运行这两种方法,您会注意到第一种方法会阻止UI,而第二种方法则不会t@apomene这并不完全正确。这完全取决于调用者如何处理返回的任务。调用者可以对其中一个使用
Wait
,并导致代码阻塞,或者使用
Wait
对其中一个不阻塞。使用
async
Wait
关键字,您可以通过编写一系列语句来执行异步代码,就像编写同步代码一样,也就是说,您可以在
任务之后立即调用
控制台。WriteLine
。运行
,而无需使用传递给
ContinueWith
的回调。它使您的异步代码看起来更干净。谢谢Cleary先生:)
static async Task DoWorkAsync()
{
    await Task.Run(() => { Thread.Sleep(10000); });
    Console.WriteLine("Work Completed");
}