2009-04-21 7 views
12

スケジュールされた間隔で、WCFサービスに別のWCFサービスを非同期で呼び出す必要があります。 WCFサービスへの呼び出しをスケジューリングしました。WCFサービスへのサンプルの呼び出しと非同期呼び出しの忘れ

私は必要と思いますが、私はここでstackoverflowについて、それらの非同期呼び出しを処理できるように、(本質的に)あなたのWCFサービスのコードを準備するか変更する必要があると読んでいます。もしそうなら、その見た目の単純な例は何でしょうか?(たぶん前と後の例).Net 3.5でもまだ必要ですか?

2番目WCFサービスからのプロキシを使用して、次のWCFサービスへの呼び出しを行っています。典型的な非同期のBeginEnvokeおよびEndEnvokeと異なるものがあれば、WCFサービスへの非同期呼び出しのサンプルが必要です。例。

私は私の質問で完全にオフであり、よりよい質問を確立するための修正を感謝したいと思います。

+0

[IDesign.net](http://idesign.net/idesign/DesktopDefault.aspx?tabindex=5&tabid=11#ConcurrencyManagement)の多数の素晴らしいサンプルが並行処理の管理の例を含みます。 –

答えて

22

呼び出し先のWCFメソッドでOperationContract属性のIsOneWayプロパティをtrueに設定します。これはWCFに対して、コールは一方向のみに重要であり、メソッドの実行が終了するまでクライアントがハングしないことを伝えます。

BeginInvokeを呼び出しても、クライアントコードはサーバメソッドの実行が完了するのを待っていますが、スレッドプールスレッドで実行されます。

[ServiceContract] 
interface IWCFContract 
{ 
    [OperationContract(IsOneWay = true)] 
    void CallMe() 
} 

あなたがやりたいために他の方法は、WCFサービスは、バックグラウンドスレッド上にその作業をスピンオフし、すぐに復帰することです。

+0

メッセージ(メソッド呼び出し)がサービスによって受信されるまで、クライアントはブロックされます。サービスの並行性の定義および/またはトランスポート・セッションの存在に依存します。 – Menahem

7

OneWay WCFコールの実行方法を慎重にテストしてください。あたかもWCFが実際にコールが終了するのを待っているかのように、X個の同時呼び出しに達したときに停止するのを見ました。

より安全な解決策は、「ターゲット」コードがすぐに制御を返すようにすることです。コールを完全に処理する代わりに、データをキューに入れて戻すようにします。他のスレッドがそのキューをポーリングし、データを非同期で処理させる。

スレッドセーフティメカニズムを適用して、そのキューで動作する2つのスレッド間の衝突を避けるようにしてください。

0

パターンにBeginInvokeやスレッドを使用しないでください。 Microsoft Webサイトに従ってAsyncPatternを使用してクラスを装飾してください。そうしないと、Asyncのデリゲートとスレッドは同期モードで実行されます。 WCFはこの動作を強制します。この情報はスタックにコールバックの質問をブロックする解決策を見つけた別のopによって投稿されました。申し訳ありませんが、私はリンクを覚えていません。

関連する問題