0

サービス操作を非同期で呼び出す場合:

proxy.OperationCompleted += new EventHandler<OperationEventArgs>(OperationCallback);
proxy.OperationAsync(OperationRequest request);

サーバー側で:

 new Thread(new ThreadStart(RunOperations)).Start();

 public OperationResponse Operation(OperationRequest request)
 {
      Queue.Enqueue(request); 
 }

 // in some other thread  
 public OperationResponse RunOperations()
 {
     OperationRequest request = Queue.Dequeue();
     OperationResponse response = Execute(request);
     // here i need to some how return to response to the threw the channel 
     // which sent the request 
 } 

私の質問 :

送信チャネルを参照し、それをスローした応答を返すために、二重チャネルを構築してコールバック経由で応答を返す方法はありますか?

4

1 に答える 1

2

WCF には独自のスレッド モデルがあります。デフォルトでは、操作は操作コントラクトを呼び出すことによって同期的に処理されます。操作コントラクトの呼び出しが終了すると、呼び出し自体も終了し、応答がクライアントに返されます。操作呼び出しでスレッドを生成する場合は、スレッドが完了するまで待機して (操作スレッドをブロックして)、応答を返す必要があります。スレッドプールからのすべてのスレッドが待機中の呼び出しによってブロックされる可能性があり、新しい要求を処理するスレッドがなくなるため、スループットの問題が発生する可能性があります。

代わりに、WCF には、非同期サービスと二重サービスという 2 つの追加メカニズムが用意されています。非同期サービスでは、スレッドプールからサーバーへのスレッドを取得し、非同期 I/O 操作が実行される最初のリクエストを取得します。I/O 実行が開始されると、操作のスレッドがスレッド プールに返され、他の要求に対応します。I/O が完了すると、操作はスレッド プールから新しいスレッドに割り当てられ、end メソッドが呼び出されます。それでも、操作自体と WCF 処理モデルが応答を処理します。スレッドを手動でフォークして、別のスレッドから応答を返すことはできません。これにより、ある種の操作でスループットが大幅に向上します。

これらのモデルのいずれもニーズに合わない場合は、必要なときにいつでもクライアントにコールバックできる二重サービスが必要です。

すべてのシナリオで、チャネルのタイムアウトに関連するいくつかの問題に対処する必要があります。

于 2012-04-17T08:52:50.670 に答える