6

私はいくつかのWCFのものを設定しようとしています。現在、リモートユーザーがファイルをダウンロードできるサーバーとクライアントがあります。サーバーでは、ServiceHost クラスを使用します。別のスレッドで実行する必要があると思いますが、誰かがファイルをダウンロードすると、サーバー UI (WinForms) がロックされます。WCF スレッド モデルを管理する方法はありますか?

ありがとうございました!

4

3 に答える 3

11

ServiceBehaviorAtttributeをサービスを実装するクラスに追加し、そのUseSynchronizationContextプロパティをfalseに設定する必要があります。これにより、サービスへの呼び出しが独自のスレッドで処理されます。

例:

[ServiceBehavior(UseSynchronizationContext=false)]
class YourService : IYourService
{
  // Service Methods
}

サービスメソッド内からコントロールを更新する場合は、Windowsフォームのクロススレッドプログラミングモデルに留意する必要があることを覚えておいてください。

于 2010-06-03T00:37:54.393 に答える
1

「UIスレッドを開始する前にServiceHostインスタンスを構築する場合、同じWindowsフォームアプリケーションから、それは独自のスレッドで実行されます。つまり、スレッドプールから割り当てられたワーカースレッドは、メッセージループではなくメッセージを処理します。したがって、サービスは複数の同時リクエストを真に処理します。」

于 2010-06-01T12:51:08.363 に答える
0

UI プログラム内で WCF サービスをホストしないでください。WCF には非常に特殊なスレッド モデルがあり、UI がうまく動作しません。

基本的に、WCF スレッド スキームは、選択したインスタンス管理動作に応じて変化します。また、WCF が実行中のスレッドを一時停止する可能性がある期間中にサービスに到達する要求がない場合も同様です。これらはすべて、UI に問題を引き起こします。

この状況で私が行うことは、WCF をホストする Windows サービスを作成し、必要なデータを監視 UI に公開する ServiceContract を作成することです。この UI は、サービスの別のクライアントである独自の exe で独立して実行され、必要に応じてサービスからデータをフェッチします。

あなたにとって意味があることを願っています。

于 2010-06-01T12:08:50.113 に答える