私はシルバーライトを使用しており、一連のsoap webserviceコールを呼び出しており、すべてが完了したことを知ってから操作を実行したいと考えています。一連のWebサービスコールが完了したかどうかを確認するには?
私は3回の呼び出しを行っています。ループで各非同期呼び出しを10回行い、それらが戻るのを待ちます。どのように10のセットの1つが完了したかを知るには?スレッド化に取り組んで以来、長い時間が経っています。
私はシルバーライトを使用しており、一連のsoap webserviceコールを呼び出しており、すべてが完了したことを知ってから操作を実行したいと考えています。一連のWebサービスコールが完了したかどうかを確認するには?
私は3回の呼び出しを行っています。ループで各非同期呼び出しを10回行い、それらが戻るのを待ちます。どのように10のセットの1つが完了したかを知るには?スレッド化に取り組んで以来、長い時間が経っています。
各呼び出しは、完了したと言うイベントをクライアントに返します。シンプルで基本的なアプローチは、各呼び出しごとにパッケージ変数をインクリメントし、次にこの値が10になるとすべての呼び出しが完了したことを知ることです。
より堅牢なメカニズムは、各要求の前に呼び出しの数を増やし、要求が完了した時点で呼び出しを減らすことです。カウンタがゼロに戻ると、すべての要求が完了したことがわかります。
この変数へのアクセスがスレッドセーフであることを確認するには、ここで注意する必要があります。
BackgroundWorkerを使用して、すべてのWebサービスコールを開始し、WaitHandle(ManualResetEventなど)を渡して、これらの配列を作成できます。次に、WaitHandle.WaitAllメソッドを使用します。各コールバックでWaitHandleを設定します。その後、バックグラウンドワーカーでは、WaitAllが設定されるまでブロックされます(WaitAllのため)。
完了したイベントが発生したとき。すべての関数呼び出しは同じスレッド上にありますか?また、整数が10に達したときにイベントを発生させる方法はありますか?または整数が10の場合、完了した呼び出しの最後に別の関数を呼び出す必要がありますか? – Justin
@Justin - このスレッドは、インクリメントとデクリメントの間のやりとりを安全に処理することです。最も単純な解決策は、 'count == 0'(または基本的なアプローチを行っていれば10)をチェックし、究極の機能を呼び出すことです。 – ChrisF