ホームページ >バックエンド開発 >C++ >C# コンソール アプリケーションで非同期コードを適切に呼び出すにはどうすればよいですか?

C# コンソール アプリケーションで非同期コードを適切に呼び出すにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-05 15:49:45174ブラウズ

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' 修飾子でマークすることはできません。」というコンパイル エラーが発生します。

では、コンソール アプリケーションで非同期コードを呼び出すにはどうすればよいでしょうか?主なアプローチは 2 つあります。

  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. を使用するカスタム コンテキスト: 非同期メソッドを呼び出すための独自のコンテキストを作成できます。このアプローチにより、より多くの制御機能とエラー処理機能が提供されます。
static void Main()
{
  AsyncContext.Run(() => MainAsync());
}

static async Task MainAsync()
{
  // Async code goes here
}
非同期コンソール アプリケーションに関するより包括的な洞察については、提供されているブログ投稿を参照してください。 「上下」ルールはすべてのシナリオにシームレスに適用されるわけではないことに注意してください。

以上がC# コンソール アプリケーションで非同期コードを適切に呼び出すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。