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



关于Tasks的.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
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方法总是与同步等待该任务相同,只是非常具体地指asyncMain方法作为应用程序的入口点的情况。当您使Main方法async时,它只是同步等待返回的任务,使其在功能上等效于只同步等待方法内部的任务,而不是使方法async仅在一种确切的情况下

(您也可以提出一个论点,即它只是试图说具有所提供参数的StartNewRun是等效的,而不打算提及异步和同步等待方法之间的区别。(

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

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

这不是违反了他们的主要实用程序吗?

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

这篇文章应该清楚地解释这两个调用之间的区别。

是的。

最新更新