首頁 >後端開發 >C++ >如何在C#控制台應用程序中實現異步編程?

如何在C#控制台應用程序中實現異步編程?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-02-01 17:06:09185瀏覽

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