gpt4 book ai didi

c# - 控制台应用程序和异步等待示例正在阻塞

转载 作者:太空宇宙 更新时间:2023-11-03 18:52:11 25 4
gpt4 key购买 nike

为什么以下示例会阻塞?我原以为“先运行”会立即运行,然后 5 秒后会出现“最后运行”。

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
// Call SomeAsyncCode() somehow
SomeAsyncCode().GetAwaiter().GetResult();

Console.WriteLine("Run First");
}

private static async Task SomeAsyncCode()
{
// Use await here!
await Task.Delay(5000);

Console.WriteLine("Run Last");
// Other async goodness...
}
}
}

最佳答案

您正在等待(松散使用的术语)任务。

如果您不使用 .GetAwaiter().GetResult();(无论如何都是内部框架方法)而只是编写会更有意义

SomeAsyncCode().Wait();
Console.WriteLine("Run First");

然后很明显发生了什么,您正在等待任务完成。

下面的可能更符合你的预期;

// start task
var task = SomeAsyncCode();

Console.WriteLine("Run First");

task.Wait();

但老实说,很少需要调用WaitResultasync 方法,在 UI 应用程序中这样做,或者使用 Synchronization Context 可能会导致死锁

理想情况下,您可以让 asyncawait 传播,在 C# 7.1 和更高版本中,您可以创建一个 async 入口点 允许您以更简洁的方式使用异步和等待模式

static async Task Main(string[] args)
{
await SomeAsyncCode();
Console.WriteLine("Run First");
}

static async Task Main(string[] args)
{
var task = SomeAsyncCode();
Console.WriteLine("Run First");
await Task.WhenAll(task);
}

关于c# - 控制台应用程序和异步等待示例正在阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54937525/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com