2

単純化された、さまざまなパラメーターで n 回実行されるメソッドがあります。

foreach(var param in params)
    ValueList.Add(SomeMethod(param));

私はこれをしたいと思います:

foreach(var param in params)
    TaskList.Add(SomeMethodAsync(param));

foreach(var task in TaskList)
    ValueList.Add(await task);

async Task<SomeValue> SomeMethodAsync(SomeParam p)
{
     //What to do here
     //To make this call async
     return SomeMethod(p);
}

非同期機能を適用するには、現在のメソッドをどのように変更する必要がありますか? はSomeMethod、非同期を提供するフレームワーク関数を使用しません。完全に同期しています。

別の言葉で説明すると、新しい async/await キーワードを使用して、このメソッドの n 個のタスクを非同期/同時に実行する必要があります。

4

2 に答える 2

2

メソッドが非同期の結果を返さない場合、async/await を使用しても意味がありません。

メソッドを並行して実行したいだけの場合は、Parallel.ForEach

Parallel.ForEach(params, param => ValueList.Add(SomeMethod(param)));

SomeMethod がタスクを使用しない場合、またはフレームワークの非同期呼び出しを待機する場合は、メソッド定義に async を追加するかどうかに関係なく、単一のスレッドで実行されます。

その場合の最良のオプションは、タスクで SomeMethod を実行することです。

async Task<SomeValue> SomeMethodAsync(SomeParam p)
{
    return await Task.Run<SomeValue>(() => SomeMethod(p));
}

個人的には、Parallel.ForEach の方がわかりやすいと思います。

于 2012-11-13T11:22:36.970 に答える
1

関数を返すタスクにするだけです。

Task<SomeValue> SomeMethodAsync(SomePAram p)
{
    return Task<SomeValue>.Run(()=> SomeMethod());
}

SomeMethodAsyncawaitable今です。

于 2012-11-13T11:54:40.297 に答える