コンソール アプリケーションでの非同期呼び出し: 「アップ」と「ダウン」の神話を暴く
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 つあります。
static void Main() { MainAsync().Wait(); // Alternatively, to avoid wrapping exceptions in AggregateException: // MainAsync().GetAwaiter().GetResult(); } static async Task MainAsync() { // Async code goes here }
static void Main() { AsyncContext.Run(() => MainAsync()); } static async Task MainAsync() { // Async code goes here }非同期コンソール アプリケーションに関するより包括的な洞察については、提供されているブログ投稿を参照してください。 「上下」ルールはすべてのシナリオにシームレスに適用されるわけではないことに注意してください。
以上がC# コンソール アプリケーションで非同期コードを適切に呼び出すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。