使用Task.Wait代替await进行异步编程

Ayu*_*ati 1 .net c# asynchronous task async-await

关于任务的 .Net 文章显示了以下两个代码片段,一个使用 wait,另一个使用 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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)

文章应该清楚地解释这两种调用之间的差异。

Ser*_*rvy 6

那么这在技术上是不是不正确呢?

不,因为它非常具体。这并不是说编写async等待任务的方法始终与同步等待该任务相同,它只是非常具体地指将async Main方法作为应用程序入口点的情况。当您创建该Main方法时async,它只是同步等待返回的任务,这在功能上相当于仅同步等待方法内的任务,而不是async 仅在一种特定情况下创建该方法。

(您还可以提出一个论点,即它只是试图说明StartNew所提供的参数Run是等效的,而不是指异步方法与同步等待方法之间的区别。)

为什么 ASP.Net 允许对它们进行同步等待?

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

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

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

文章应该清楚地解释这两种调用之间的差异。

是的,应该的。