使用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而不是等待异步编程的主要内容,如果未能解决你的问题,请参考以下文章
Javascript - 异步等待和获取 - 返回值,而不是承诺?