2

次の2つの方法があります。

private static void webservicecalls()
{
   WebServiceOne();
   WebServiceTwo();
}

では、最初の Web サービス呼び出しが完了するのを待ってから 2 番目の Web サービスを呼び出す代わりに、これら 2 つのメソッドを非同期的に呼び出すにはどうすればよいでしょうか?

アップデート:

WebServiceOne と WebServiceTwo の両方に、次のようなサブ呼び出しがあります。

private static void WebServiceOne()
{
    CallOne();
    CallThree();
}

private static void WebServiceTwo()
{
    CallTwo();
    CallFour();
}

だから私は、サブ呼び出しのために次のシーケンスを持つために呼び出しが必要です:-

CallOne();
CallTwo();
CallThree();
CallFour();
4

4 に答える 4

5

実装に使用しているものによってはwebserviceone webservicetwo、Webサービスツール自体が完全な非同期サポートを備えている可能性が非常に高いため、最初に行うことは、それを確認し、同期APIではなく非同期APIを使用することです。

何らかの理由でそれが存在しない場合は、次のようなことができます。

var task = new Task(() => webservice1());
task.Start();
webservice2();
task.Wait();

(明らかに、両方を完全に非同期で実行できます。上記では、両方を並行して実行し、最後に「参加」したいと想定しています)

編集をやり直してください。順序が正確に「1」、「2」、「3」、「4」でなければならない場合、それらを並行して実行することはできないため、代わりにすべてをバックグラウンドで実行する必要があります。 :

new Task(() => {
    webservice1();
    webservice2();
}).Start();

これにより、並列処理が犠牲になり、実行順序が保証されます。

于 2012-10-19T11:33:22.633 に答える
2
Action one = () => WebServiceOne();
Action two = () => WebServiceTwo();
one.BeginInvoke(null, null);
two.BeginInvoke(null, null);
于 2012-10-19T11:33:02.140 に答える
1

私はアクションを使うのが好きです。

private static void WebServiceCalls()
{ 
    var someState = 3;
    Action a1 = () => { WebserviceOne(); };
    Action a2 = () => { WebserviceTwo(); };

    a1.BeginInvoke(WebServiceCallBack, someState); //see code section below
    a2.BeginInvoke(null, null); //fire and forget...

}

これにより、コードを処理するための Callback を作成することもできます。

void WebServiceCallBack(IAsyncResult result)
{
    int state = (int)result.AsyncState;
    //do more??
}

@Mark は有効なポイントを提示します。Visual Studio 内で Web サービスを使用している場合は、サービス参照構成ウィンドウを使用して、非同期構文でチャネル プロキシ クラスを作成できます。(つまり、BeginWebServiceOneandEndWebServiceOneを使用すると、非同期ラッパーを作成する必要がなくなります。)

于 2012-10-19T11:42:30.607 に答える
0

こちらのタスクライブラリと、左側のサブカテゴリのナビゲーションをご覧ください。

http://msdn.microsoft.com/en-us/library/dd537609.aspx

于 2012-10-19T11:34:15.427 に答える