首頁 >後端開發 >C++ >如何在C#控制台應用程式中正確呼叫非同步程式碼?

如何在C#控制台應用程式中正確呼叫非同步程式碼?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-05 15:49:45202瀏覽

How Do I Properly Invoke Asynchronous Code in C# Console Applications?

控制台應用程式中的非同步呼叫:揭穿「向上」和「向下」神話

在C# 中,呼叫非同步方法時,人們普遍認為,必須在呼叫堆疊的「上」和「下」保持同步。然而,這個教條不適用於控制台應用程式。

考慮以下程式碼片段:

public static async Task<int> SumTwoOperationsAsync()
{
    // Simulate time-consuming operations
    var firstTask = GetOperationOneAsync();
    var secondTask = GetOperationTwoAsync();

    // Sum the results of the operations
    return await firstTask + await secondTask;
}

private static async Task<int> GetOperationOneAsync()
{
    await Task.Delay(500); // Simulating operation delay
    return 10;
}

private static async Task<int> GetOperationTwoAsync()
{
    await Task.Delay(100); // Simulating operation delay
    return 5;
}

根據「向上和向下」規則,標記 Main 函數似乎是合乎邏輯的,其中 SumTwoOperationsAsync 作為非同步呼叫。然而,這個假設是不正確的。控制台應用程式不支援非同步入口點。嘗試這樣做將導致編譯錯誤,指出「入口點無法使用『async』修飾符進行標記。」

那麼,我們如何在控制台應用程式中呼叫非同步程式碼呢?主要有兩種方法:

  1. 使用 Wait 或 GetAwaiter().GetResult(): 此方法同步等待 SumTwoOperationsAsync 傳回的任務。
static void Main()
{
  MainAsync().Wait();
  // Alternatively, to avoid wrapping exceptions in AggregateException:
  // MainAsync().GetAwaiter().GetResult();
}

static async Task MainAsync()
{
  // Async code goes here
}
  1. 使用自訂Context:您可以建立自己的上下文來呼叫非同步方法。這種方法提供了更多的控制和錯誤處理功能。
static void Main()
{
  AsyncContext.Run(() => MainAsync());
}

static async Task MainAsync()
{
  // Async code goes here
}

有關非同步控制台應用程式的更全面的見解,請訪問提供的部落格文章。請記住,「上下」規則可能無法無縫適用於所有場景。

以上是如何在C#控制台應用程式中正確呼叫非同步程式碼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn