201

私はこの簡単なコードを持っています:

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

私は何が欠けていますか?

4

4 に答える 4

343

ほとんどのプロジェクト タイプでは、async「アップ」と「ダウン」はasync voidイベント ハンドラで終了するか、フレームワークに を返しTaskます。

ただし、コンソール アプリはこれをサポートしていません。

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コンソール アプリの詳細については、ブログ を参照してください。

于 2013-07-13T13:14:03.830 に答える
98

これを行う最も簡単な方法は次のとおりです

static void Main(string[] args)
{
    Task t = MainAsync(args);
    t.Wait();
}

static async Task MainAsync(string[] args)
{
    await ...
}
于 2014-05-04T01:38:52.037 に答える
4

迅速で非常に範囲の広いソリューションとして:

タスク.結果

Task.Result と Task.Wait の両方を I/O と共に使用すると、スケーラビリティを向上させることはできません。これは、呼び出し元のスレッドが I/O の終了を待ってブロックされたままになるためです。

不完全な Task で .Result を呼び出すと、メソッドを実行するスレッドは、タスクが完了するまで座って待機する必要があります。これにより、その間、スレッドは他の有用な作業を実行できなくなります。これは、タスクの非同期の性質の利点を無効にします。

非同期

于 2016-11-07T21:34:11.327 に答える