3

私は今、非同期コードを構築する方法を決定する必要がある時点にいます。関数Func1()から一度に20の異なるWebサービスを呼び出す必要があり、それらがすべてxml回答を返したら、すべての結果を1つの大きなxmlに結合します。

TPLタスクの使用を考えました。このようなもの:

var task = Task.Factory.StartNew (call the web service1...);
var task2 = Task.Factory.StartNew (call the web service2...);
var task3 = Task.Factory.StartNew (call the web service3...);

task.WaitAll();

それは良い音ですか、それとも仕事を成し遂げるためのより良い方法がありますか?

4

4 に答える 4

2

私の頭に浮かぶアプローチは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(); });
}

上記は最初に示したコードと同じですが、内部ではフレームワークがすべてを処理します。

これが役立つことを願っています。

于 2013-08-02T10:53:12.977 に答える