2009-09-03 14 views
2

このシナリオをどのように達成できますか?WCF:サービス内からWindowsフォームにアクセスする

私はWCFサービスをWindowsフォームでホストしています。サービスのクライアントがサービスのメソッドを呼び出すたびに、サービスはWindowsフォームのテキストボックスにメッセージを書き込むことができます。

私は自分のWCFサービスをシングルトンにし、フォームが実装しているインターフェイスを使って自分のフォームをサービスに渡し、そのインスタンスを保存すると考えていました。クライアントがサービスを呼び出すと、単にフォームインスタンスを使用してテキストボックスに書き込むことができます。

私はFormをWCFサービスに渡すことができないので、もちろんこれを行うことはできません。

アイデアやコードサンプルはありますか?

+0

サービスは、誰かがあなたのWinFormsアプリケーションを実行している場合にのみ機能しますか? –

答えて

1

this SO answerをご覧ください - 私が理解する限り、基本的に同じ質問です。

は、WCFサービスへの依存関係を注入します。すべてを結ぶカスタムServiceHostFactoryを実装するだけで済みます。

2

サービスインスタンスとWindowsフォームが別々の2つのスレッドで実行されているため、メインUIスレッドのUI要素をサービスインスタンスから更新することはできません。

サービススレッドからUIを適切かつ安全に更新するには、同期コンテキストとデリゲートを使用する必要があります。

this CodeProjectの記事を参照してください。記事の中頃、「UIスレッドの不具合」について、著者が語ります。それはあなたが何をする必要があるか、基本的です:トピックを総合的に紹介のための

SendOrPostCallback callback = 
    delegate (object state) 
    { 
     yourListBox.Add(state.ToString()); 
    }; 

_uiSyncContext.Post(callback, guestName); 

参照ジュバル・ロウィのMSDNの記事「WCF Synchronization Contexts」。

Winformsアプリケーション内でWCFサービスをホストすることは、私にとってはむしろ悪い考えです。まず、これらのスレッドの問題が原因です.2番目は、winformsアプリケーションが稼動している場合にのみ動作します。 WCFサービスをコンソールアプリケーションまたはWindows NTサービスに入れて、次にWinformsベースの監視アプリケーションを作成して、それを確認することはできませんでした。着信要求メッセージなどのデータベーステーブル?

Marc

+1

リッチクライアント内でWCFサービスをホストすることは、完全に有効なシナリオです。たとえば、コールバックチャネルの実装、ピアツーピアネットワークの設定などに使用できます.WCFは単なるサーバーベースの技術ではありません。 –