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