私の頭に浮かぶアプローチは2つあります。
A. _ あなたが今やっている方法ですが、この回答とこの記事で説明されているように、ContinueWith
継続を使用しています。したがって、あなたのケースでは、子タスクを使用して単一の継続を使用する可能性があるため、ContinueWhenAll
TaskCreationoptions op = TaskCreationOptions.AttachedToParent;
Task.Factory.StartNew(() =>
{
var task1 = Task.Factory.StartNew (CallService(1));
var task2 = Task.Factory.StartNew (CallService(2));
var task3 = Task.Factory.StartNew (CallService(3));
})
.ContinueWith(ant => { SomeOtherselegate });
または、こちらで説明されているように、継続を連鎖させることもできます。
別の方法は、を使用することContinueWhenAll
です。
var task1 = Task.Factory.StartNew (CallService(1));
var task2 = Task.Factory.StartNew (CallService(2));
var task3 = Task.Factory.StartNew (CallService(3));
var continuation = Task.Factory.ContinueWhenAll(
new[] { task1, task2, task3 }, tasks => Console.WriteLine("Done!"));
ここで考えるべき唯一のことは、タスクの数を可変にする方法ですが、これは簡単です。
B. _ もう 1 つの方法は、.NET4.5+ とasync
/を使用することawait
です。したがって、コードは次のようになります
private async void CallAllServicesAsync()
{
await CallServiceAsync(1);
await CallServiceAsync(2);
await CallServiceAsync(3);
}
どこ
private Task CallServiceAsync(int serviceNumber)
{
return Task.Run(() = > { SomeMethod(); });
}
上記は最初に示したコードと同じですが、内部ではフレームワークがすべてを処理します。
これが役立つことを願っています。