关于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
方法总是与同步等待该任务相同,只是非常具体地指async
Main
方法作为应用程序的入口点的情况。当您使Main
方法async
时,它只是同步等待返回的任务,使其在功能上等效于只同步等待方法内部的任务,而不是使方法async
仅在一种确切的情况下。
(您也可以提出一个论点,即它只是试图说具有所提供参数的StartNew
和Run
是等效的,而不打算提及异步和同步等待方法之间的区别。(
为什么ASP.Net允许同步等待它们?
Task
并不是专门为异步完成的工作而创建的。它的设计目的是实现和使用多个线程同步并行工作。当您使用任务进行异步时,基本上不应该使用Wait
或其他同步阻塞机制,但如果您使用它来同步执行多线程工作,它会很有用。你可以提出一个很好的论点,他们应该把这些概念分开,但他们没有,现在改变已经太晚了。
这不是违反了他们的主要实用程序吗?
是的,是的。这就是为什么我不喜欢这种实现,我更希望他们以不同的方式实现它。但他们没有。
这篇文章应该清楚地解释这两个调用之间的区别。
是的。