首页 >后端开发 >C++ >如何在C#控制台应用程序中实现异步编程?

如何在C#控制台应用程序中实现异步编程?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-02-01 17:06:09184浏览

How Can I Implement Asynchronous Programming in C# Console Applications?

C#控制台应用程序中的异步编程:理解async修饰符

在异步编程中,async修饰符表示方法将与其他代码并发运行。然而,在控制台应用程序中,Main方法不能定义为async,这给希望使程序异步的开发者带来了挑战。

本文深入探讨了这个问题,并探讨了在控制台应用程序中实现异步行为的替代方法。

控制台应用程序中的async修饰符

在Visual Studio 2012中,禁止将Main方法定义为async。然而,在Visual Studio 2017 Update 3 (15.3)及更高版本中,只要返回TaskTask<T>,语言现在支持async Main方法。这允许开发者编写如下代码:

<code class="language-csharp">class Program
{
    static async Task Main(string[] args)
    {
        Bootstrapper bs = new Bootstrapper();
        var list = await bs.GetList();
    }
}</code>

这种方法似乎阻塞了主线程,类似于使用GetAwaiter().GetResult()。但是,在发布C# 7.1的官方语言规范之前,这种行为仍然是一个假设。

异步控制台应用程序的替代方法

async Main方法不可行时,开发者可以采用以下替代方法之一:

  1. 自定义上下文: 为控制台应用程序创建一个与async兼容的自定义“主循环”。此循环充当异步方法的容器。
  2. 阻塞主线程: 在异步工作完成之前阻塞主控制台线程。这可以使用以下方法实现:
<code class="language-csharp">class Program
{
    static void Main(string[] args)
    {
        MainAsync(args).GetAwaiter().GetResult();
    }

    static async Task MainAsync(string[] args)
    {
        Bootstrapper bs = new Bootstrapper();
        var list = await bs.GetList();
    }
}</code>

通过使用GetAwaiter().GetResult()而不是Wait()Result,开发者可以避免使用这些方法时发生的AggregateException包装。

总而言之,虽然async Main方法为异步控制台应用程序提供了一种更直接的方法,但对于旧版本的Visual Studio或当async Main方法不适合特定实现时,可以使用替代方法。

以上是如何在C#控制台应用程序中实现异步编程?的详细内容。更多信息请关注PHP中文网其他相关文章!

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