首页 >后端开发 >C++ >我可以使控制台应用程序的主要方法异步吗?

我可以使控制台应用程序的主要方法异步吗?

Susan Sarandon
Susan Sarandon原创
2025-02-01 16:56:10860浏览

Can I Make My Console Application's Main Method Asynchronous?

Console 应用中的异步 Main 方法

在尝试将控制台应用程序中的 Main 方法设为异步时,可能会遇到错误:“无法在控制台应用程序的 Main 方法上指定 'async' 修饰符”。

编译器限制

历史上,Visual Studio 编译器限制了在 Main 方法上使用 async 修饰符。这是为了防止异步执行与控制台程序的自然同步行为冲突。

对异步 Main 的支持

但是,从 Visual Studio 2017 Update 3 (15.3) 开始,C# 支持异步 Main 方法,只要它们返回 Task 或 Task 即可。这允许以下代码结构:

<code class="language-csharp">class Program
{
    static async Task Main(string[] args)
    {
        // 异步代码在此处
    }
}</code>

理解行为

在异步 Main 方法中,“await” 关键字指示可等待对象(例如,任务)在完成时完成方法,之后方法返回。但是,在控制台应用程序中,Main 方法的返回将退出程序。

避免程序退出

为了防止程序退出,必须为 Main 方法提供一个与异步兼容的上下文。此上下文在异步操作运行时保持程序处于活动状态。

上下文选项

  • NuGet 库:使用 Nito.AsyncEx NuGet 包中的 AsyncContext。
  • 异步 CTP:使用异步 CTP 中的 GeneralThreadAffineContext(如果可用)。
  • 自定义 Main 循环:使用 AsyncContext 或异步 CTP 实现您自己的异步主循环。

阻塞主线程

另一种方法是阻塞主控制台线程,直到异步工作完成:

<code class="language-csharp">class Program
{
    static void Main(string[] args)
    {
        MainAsync(args).GetAwaiter().GetResult();
    }

    static async Task MainAsync(string[] args)
    {
        // 异步代码在此处
    }
}</code>

注意:GetAwaiter().GetResult() 避免了使用 Wait() 或 Result() 时发生的 AggregateException 包装。

以上是我可以使控制台应用程序的主要方法异步吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

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