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