2012-03-29 19 views
1

Webサービスでの並列Webサービス呼び出しのベストプラクティスに関する質問がありました。これは、プロジェクトの別の部分が時間通りに納品できない場合のバックアップ計画のためのものです。私はむしろ、たとえそれが捨て去られたとしても、動作するものを持っているので、エンドユーザは中断されません。WebサービスのWebサービスへの呼び出しのスレッド - (.net 2.0)

私たちのポータルは、メッセージを取得する2つのメッセージにそのメッセージを分割して、私たちのブローカーに2つの呼び出しを行います。タイムアウトを減らすには、これらのスレッドを別々にする必要があります。

(擬似コード)に似たようなことを行う方法があります。 *アップデート:思ったほど効率的ではありませんが、高速に実行しますが、呼び出しはデリゲートを介して非同期的に高速です。

XmlNode DNode = GetaGetDemoNodeSomehow(); 
XmlNode ENode = GetAGetElNodeSomehow(); 
XmlNode elResponse; 
XmlNode demResponse; 
Thread dThread = new Thread(delegate 
{ 
    //Web Service Call 
    GetDemographics d = new GetDemographics(); 
    demResponse = d.HIALRequest(DNode); 
}); 
Thread eThread = new Thread(delegate 
{ 
    //Web Service Call 
    GetEligibility ge = new GetEligibility(); 
    elResponse = ge.HIALRequest(ENode); 
}); 
dThread.Start(); 
eThread.Start(); 
dThread.Join(); 
eThread.Join(); 
//combine the resulting XML and return it. 
//Maybe throw a bit of logging in to make architecture happy 

もう1つのオプションは、ワーカークラスを作成してサービス情報を渡して実行することです。これにより、何が起こっているのかをもう少しコントロールできるようになりますが、オーバーヘッドが増える可能性があります。

2つの非同期呼び出しがあり、フラグを使用してリターンを管理することもできます。 更新: *これは私が試した更新方法ほど効率的ではありません。これは私が以下のように25%遅くなります(最適化されています)。

 personRevisedService.GetDemoCompleted += new GetDemoCompletedEventHandler(GetDemo_Completed);      
     personRevisedService.GetDemoAsync(SomeXML); 

ポータルサービスは1日約50,000回呼び出されます。

私はこの吸盤を金プレートにしたくありません。

私は軽いものを探しています。ブローカで呼び出されているサービスには制限時間が設定されており、すでに大量のログと監査が行われているため、その部分については心配していません。

これは.NET 2.0であり、私がアップグレードしたいと思っている限り、今はできません。だから、> 2.0のすべてのグッズを残してください。

更新

私は、デリゲートを使用してそれらを呼び出すことにしました。これはテストなので、他のサービスがまだ構築されていないので、同じサービスを2回呼びます。それは、

public delegate XmlElement HServiceDelegate(XmlElement xml); 


HServiceDelegate del1 = new HServiceDelegate(ws1.HGetDemographics); 
HServiceDelegate del2 = new HServiceDelegate(ws2.GetDemographics); 

IAsyncResult async1 = del1.BeginInvoke(x1.DocumentElement, callback1, null); 
IAsyncResult async2 = del2.BeginInvoke(x2.DocumentElement, callback2, null); 

//Not sure if this is the most efficient 
while (!async1.IsCompleted && !async2.IsCompleted) 
{ 
    System.Threading.Thread.Sleep(5); 
} 



void callback1(IAsyncResult result) 
{ 
    AsyncResult r = (System.Runtime.Remoting.Messaging.AsyncResult)result; 
    HServiceDelegate caller = (HServiceDelegate)r.AsyncDelegate; 
    r1 = caller.EndInvoke(result); 
} 
+0

ちょうど脇に、2つのメッセージを両方のスレッドに送信してそれらを待つことによる利益はほとんどありません。代わりに、それらのうちの1つをメインスレッドに送信するためのロジックを保持し、1つの_new_スレッドのみを生成して他のスレッドに送信します。メインスレッドがちょうどアイドル状態のままになる場合、別のスレッドに作業を負荷することには意味がありません。 –

答えて

1

あなたのアプローチは非常に非効率的で、かつ非常によく良いよりも害を引き起こす可能性があり[WebServiceName]非同期(...)を使用するよりも20から30パーセント速く、平均して実行しました。両方の呼び出しが完了するまで、ワーカースレッドを束縛しています。正当な理由がない場合は、多くのフルスレッドを生成します。

サービスを非同期にし、Web参照のBegin/End *メソッドを使用してください。

+0

正直なところをありがとう。残念ながら、私たちはサービスをその場で変更することはできませんが、それは私たちの変更の範囲を超えてしまい、回帰に混乱を招きます。したがって、このルートでは、[ServiceName] Asyncメソッドを使用してコールバックで応答をキャッチし、処理を続行する前に他のメッセージが終了するのを待ちますか?(私は常にWebサービスのスレッドを使用していないので、安全なオプションを探しています)。 –

+0

ここでは非同期のASMX Webメソッドを行う[古い方法](http://msdn.microsoft.com/en-us/library/aa480516.aspx)です。ここには[新しい方法](http://www.dotnetbips.com/articles/464737e2-afcb-4f00-8df2-13f3436a66fa.aspx)があります。 –

+0

私はあなたの提案を信頼しています、そして、それは私が行くことを考えていたところです。リンクをありがとう、新しい方法は私が今試作しているものです。もう一度ありがとう –

関連する問題