在这种情况下,任务延迟问题



我是任务新手,所以我决定在这里写一个简单的方法

static async Task Work()
{
Console.WriteLine("download started");
await Task.Run(async () => {
for (var i = 0; i < 10; i++)
{
Console.WriteLine($"{i}: is downloading");
await Task.Delay(1000);
}
});
Console.WriteLine("done");
}

在这里打电话

static void Main()
{
Work();
}

这里的问题是输出

预期输出:

starting 
1
2
...
9
done

实际输出:

download started
0: is downloading

我假设这个简单的场景有一个重复的帖子,但我找不到它......

控制台应用程序中的主线程是特殊的。由于它是唯一的前台线程,因此当它退出时,整个应用程序都会退出。

如果使用的是 C# 7.1 或更高版本,则可以指定如下async Task Main方法:

static async Task Main()
{
await Work();
}

在后台,这将阻塞您的主线程,直到操作完成。对于旧版本的 C#,您可以自己执行此操作:

static void Main()
{
Work().GetAwaiter().GetResult();
}

通常,您不希望阻止异步代码;控制台应用程序的Main方法是此规则的例外

最新更新