Task.Run()中的Aync/Await操作

Cha*_*dan 9 .net c# asynchronous

Task.Run(()=>{})将操作委托放入队列并返回任务.在Task.Run()中使用async/await有什么好处吗?我知道Task.Run()是必需的,因为如果我们想直接使用await,那么调用方法将需要成为Async并且会影响调用的地方.

以下是在Task.Run()中具有异步等待的示例代码.完整示例如下:https://msdn.microsoft.com/en-us/library/hh228607(v = vs.110).aspx

Task.Run(async () => { await new WebClient().DownloadStringTaskAsync("");});
Run Code Online (Sandbox Code Playgroud)

或者这可以做到,

Task.Run(() => new WebClient().DownloadStringTaskAsync("").Result;);
Run Code Online (Sandbox Code Playgroud)

由于Task.Run()和Await都将对工作进行排队并将被线程池选中,因此Task.Run()中的async/await是否有点多余?

usr*_*usr 8

在 Task.Run() 中使用 async/await 有什么好处吗

您也可以问相反的问题:为什么要在 Task.Run 中包装 async/await 代码?!

一旦第一个等待被命中(对未完成的任务进行操作),异步方法就会返回给调用者。因此,如果异步方法的第一次执行“连续”需要很长时间Task.Run将改变行为:它将导致该方法立即返回并在线程池上执行第一个“连续”。

这在 UI 方案中很有用,因为这样您可以 100% 确保您没有阻止 UI。示例:HttpWebRequest即使您使用其中一种异步方法(这基本上是库错误/设计错误),也会同步进行 DNS 解析。这可以暂停 UI 线程。因此,您可以使用 Task.Run 来 100% 确保 UI 不会被阻塞超过几微秒。

所以回到最初的问题:为什么在 Task.Run 主体内等待?出于与您通常等待相同的原因:解除阻塞线程。

  • @David 在这种情况下,通常只需对返回的任务调用 Wait/Result 即可。 (2认同)

Yac*_*sad 7

在Task.Run()中使用async/await有什么好处吗?

是.Task.Run在线程池线程上运行一些操作.如果此类操作执行某些IO工作并异步等待IO操作通过await,则在IO操作仍在运行时,系统可以使用此线程池线程进行其他工作.

例:

Task.Run( async () =>
{
    DoSomeCPUIntensiveWork();

    // While asynchronously waiting for this to complete, 
    // the thread is given back to the thread-pool
    var io_result = await DoSomeIOOperation(); 

    DoSomeOtherCPUIntensiveWork(io_result);
});
Run Code Online (Sandbox Code Playgroud)