1. ホーム
  2. c#

[解決済み】C#のコンソールアプリケーションで「async」を使用する【重複あり

2022-04-20 21:44:53

質問

こんな簡単なコードがあります。

public static async Task<int> SumTwoOperationsAsync()
{
    var firstTask = GetOperationOneAsync();
    var secondTask = GetOperationTwoAsync();
    return await firstTask + await secondTask;
}


private async Task<int> GetOperationOneAsync()
{
    await Task.Delay(500); // Just to simulate an operation taking time
    return 10;
}

private async Task<int> GetOperationTwoAsync()
{
    await Task.Delay(100); // Just to simulate an operation taking time
    return 5;
}

素晴らしい。これはコンパイルされます。

しかし、コンソールアプリケーションを持っていて、上のコードを実行したいとします(呼び出しは SumTwoOperationsAsync() ).

static void Main(string[] args)
{
     SumTwoOperationsAsync();
}

しかし、私は sync を同期させなければなりません。 アップ :

これは、私の Main としてマークする必要があります。 async ?

さて、それは できない は、コンパイルエラーがあるためです。

エントリーポイントに 'async' 修飾子を付けることができません。

もし私が非同期のことを理解しているならば、スレッドは Main 関数 → SumTwoOperationsAsync →は両方の関数を呼び出すことになり、アウトになります。しかし SumTwoOperationsAsync

何が足りないのか?

解決方法は?

ほとんどのプロジェクトタイプで async という文字列で終わります。 async void イベントハンドラまたは Task をフレームワークに送信します。

ただし、Consoleアプリはこれに対応していません。

を行うだけか、あるいは Wait を返します。

static void Main()
{
  MainAsync().Wait();
  // or, if you want to avoid exceptions being wrapped into AggregateException:
  //  MainAsync().GetAwaiter().GetResult();
}

static async Task MainAsync()
{
  ...
}

または 私が書いたような独自のコンテキストを使用します。 :

static void Main()
{
  AsyncContext.Run(() => MainAsync());
}

static async Task MainAsync()
{
  ...
}

の詳細情報 async コンソールアプリは ブログ .