3

私のメソッドでRecalcChartAsyncは、時間のかかる作業をいくつか行います..だから、非同期でいくつかのことを行うと思いました。

私は 2 つのメソッドを開始CreateHistogramAsync CalculatePropValuesAsyncし、その間にいくつかのことを行いRecalcChartsAsync、最後にそれが完了するのを待ちたいと思います。

 private async void RecalcChartsAsync()
{
    var histogram = CreateHistogramAsync();
    var propValues = CalculatePropValuesAsync();

    //do some other stuff

    await histogram;
    await propValues;
}

private async Task CreateHistogramAsync()
{
    //do some stuff
}

private async Task CalculatePropValuesAsync()
{
    //do some stuff
}

ReSharper が CreateHistogramAsync および CalculatePropValueAsync の async キーワードで次の警告を表示するため、正しい方法で実行しているかどうかはわかりません。

この非同期メソッドには「await」演算子がなく、同期的に実行されます。await 演算子を使用して非ブロッキング API 呼び出しを待機することを検討してください。

この非同期処理を正しい方法で使用しているかどうかはわかりません。

4

3 に答える 3

9

今、私はこの非同期のものを正しい方法で使用しているかどうかわかりません。

それはそれのように聞こえません。メソッドがあるからといって、asyncそれが別のスレッドで実行されることを意味するわけではありません。それはあなたが期待していることのように聞こえます。メソッドを実行するasyncと、最初の式に到達するまで、同期的に(つまり、通常のように)実行されawaitます。式がない場合、awaitつまり、通常どおりに実行されます。唯一の違いは、タスクによって表される完了ステータス(例外など)を使用して、ステートマシンにラップされる方法です。

CreateHistogramAsyncCalculatePropValuesAsyncメソッドを同期するように変更する必要があると思います。

private void CreateHistogram()
{
    ...
}

private void CalculatePropValues()
{
    ...
}

Task.Runそしてそれらを並行して実行するために使用します:

private async void RecalcChartsAsync()
{
    var histogram = Task.Run((Action) CreateHistogram);
    var propValues = Task.Run((Action) CalculatePropValues);

    //do some other stuff

    await histogram;
    await propValues;
}
于 2013-02-28T14:57:00.287 に答える
3

メソッド内に待っているものは何もないので、その時点でマークを付けるのasyncは無意味です。そのため、ReSharperは警告を発しています。

async/の仕組みを学ぶことから始める必要があります:http await//msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx

于 2013-02-28T14:55:46.770 に答える
1

最後の2つのメソッドで何も待っていない場合は、宣言から非同期を削除します。この場合、タスクを作成して返すだけで、目的を達成できます。

于 2013-02-28T14:57:35.780 に答える