首页 >后端开发 >C++ >如何在C#的Main方法中正确等待异步方法调用?

如何在C#的Main方法中正确等待异步方法调用?

Linda Hamilton
Linda Hamilton原创
2025-01-03 20:07:39863浏览

How to Properly Await Asynchronous Method Calls in C#'s Main Method?

在 Main 中调用异步方法

在 C# 中,可以使用异步编程以非阻塞的方式执行操作。异步方法允许任务与其他代码同时运行,从而释放线程来处理其他任务。但是,当从 Main 方法调用异步方法时(该方法本身不是异步方法),我们需要进行一些调整,让 Main 方法等待异步操作完成。

使用 Async Main 方法(C# 7.1 及更高版本)

从 C# 7.1 开始,Main 方法可以修改为async,允许直接使用await运算符。这允许 Main 方法充当异步操作的入口点。例如:

static async Task Main(string[] args)
{
    test t = new test();
    await t.Go();
    Console.WriteLine("finished");
    Console.ReadKey();
}

使用阻塞等待方法(早期 C# 版本)

对于早期版本的 C#,Main 方法不能声明为异步。相反,await 运算符不能直接使用。我们需要使用 Wait 方法手动等待异步操作完成。例如:

static void Main(string[] args)
{
    test t = new test();
    t.Go().Wait();
    Console.WriteLine("finished");
    Console.ReadKey();
}

避免死锁

问题中提供的示例尝试使用 GetAwaiter.OnCompleted 来处理 Go 任务的完成。但是,这可能会导致死锁,因为它尝试在已同步的上下文上运行同步延续。通过将 Main 方法修改为异步或使用上面提到的 Wait 方法,我们可以避免此问题并允许异步操作正常完成。

以上是如何在C#的Main方法中正确等待异步方法调用?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn