使用Task.Wait而不是等待异步编程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Task.Wait而不是等待异步编程相关的知识,希望对你有一定的参考价值。

.Net article on Tasks显示以下两个代码片段,一个使用await,另一个使用Task.Wait,并且两者都是“功能相同”。

那技术上不正确吗?有人可以澄清一下吗?

此外,如果任务应该是异步的并构成异步编程(TPL)的基础,那么为什么ASP.Net会允许对它们进行同步等待呢?这不是违反他们的主要用途吗?

using System;
using System.Threading.Tasks;

public class Example
{
   public static async Task Main()
   {
      await Task.Run( () => {
                                  // Just loop.
                                  int ctr = 0;
                                  for (ctr = 0; ctr <= 1000000; ctr++)
                                  {}
                                  Console.WriteLine("Finished {0} loop iterations",
                                                    ctr);
                               } );
   }
}
// The example displays the following output:
//        Finished 1000001 loop iterations
using System;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
      Task t = Task.Factory.StartNew( () => {
                                  // Just loop.
                                  int ctr = 0;
                                  for (ctr = 0; ctr <= 1000000; ctr++)
                                  {}
                                  Console.WriteLine("Finished {0} loop iterations",
                                                    ctr);
                               } );
      t.Wait();
   }
}
// The example displays the following output:
//        Finished 1000001 loop iterations

文章应该清楚地解释两个电话之间的差异。

答案

那技术上不正确吗?

不,因为它非常具体。这并不是说编写一个等待任务的async方法总是与同步等待该任务相同,它只是非常具体地指的是async Main方法作为应用程序的入口点的情况。当你制作Main方法async时,它只是同步等待返回的任务,使它在功能上等同于只是同步等待方法内的任务,而不是只在那个确切的情况下制作方法async

(你也可以提出一个论点,它只是试图说StartNew提供的参数和Run是等价的,并不打算引用异步与同步等待的方法之间的区别。)

为什么ASP.Net会允许同步等待它们呢?

Task并非专门用于表示异步完成的工作。它旨在实现这一目标,并使用多个线程同步并行工作。当您使用异步任务时,基本上不应该使用Wait或其他同步阻塞机制,但如果您使用它同步执行多线程工作,那么它很有用。你可以做一个[好]的论点,他们应该将这些概念分开,但他们没有,现在改变它已经太晚了。

这不是违反他们的主要用途吗?

是的,是的。这就是为什么我不喜欢这种实现的原因,并且希望他们以不同的方式实现它。但他们没有。

文章应该清楚地解释两个电话之间的差异。

是的,它应该。

以上是关于使用Task.Wait而不是等待异步编程的主要内容,如果未能解决你的问题,请参考以下文章

我应该使用 Task.Wait() 吗?

Javascript-异步等待并获取-返回值,而不是诺言?

Javascript - 异步等待和获取 - 返回值,而不是承诺?

async,await与task.wait()或task.Result的区别

C#使用异步操作时的注意要点(翻译)

C#异步编程概念和使用