有以下 C# 代码:
using System;
using System.Threading.Tasks;
using AlgorithmTools;
namespace AsyncMethods
{
class Program
{
public static async void MethAsync(int num) => Console.WriteLine($"Factorial of {num} is {await FactorialAsync(num)}");
private static Task<int> FactorialAsync(int num)
{
return Task.Factory.StartNew(() =>
{
int result = 1;
foreach (int i in new Range(2, num + 1))
result *= i;
return result;
});
}
static void Main(string[] args)
{
MethAsync(5);
}
}
}
因为 当在返回值块上MethAsync调用并将控制权转移给方法时,程序应该终止而不打印阶乘值,但是,它被打印了。但是,如果不是返回值is ,那么一切都会按原样完成,它将在计算阶乘之前结束。为什么会这样?awaitFactorialAsyncMainvoidMethAsyncTaskMain
我在我的电脑上看不到任何东西。
这并不奇怪:您本质上是在两个事件之间进行竞赛:程序的结束和任务的结束,您无需等待
Main。如果程序完成得更快(如我的),则不会出现输出。如果程序完成得更慢(就像您在两种情况之一中所做的那样),则作业有时间完成,并且您会看到输出。重写程序,让它等待任务结束,然后它的行为将是确定性的:
(顺便说一句,
Task.Factory.StartNew使用 . 更有意义Task.Run。)