2011-08-12 9 views
4

クライアントからAction<> CallBackが送信されたServiceクラスがあります。メインUIスレッドをサービスから呼び出す方法

メインUIスレッドでAction<> CallBackを呼び出すにはどうすればいいですか?クライアントがUIスレッドでコールバックを取得するにはどうすればいいですか。サービスは、アプリケーションドメイン(WCF、Remotingを)交差をやっていると仮定すると

+0

あなたの質問はあまり明確ではありません。サービスはWinFormsとはどのように通信しますか? –

+0

あなたが「サービス」と言うとき、あなたは何を話していますか? –

答えて

1

通常、スレッド化に対処するためにWinformsコードに任せておく方が良いです。 System.Timers.TimerとFileSystemWatcherで使用されるパターンを考慮するには、SynchronizingObjectプロパティがあります。このプロパティは、WinformsコードでUIスレッドで発生したイベントを取得するように設定できます。これと同じようにしてください:

using System; 
using System.ComponentModel; 

class Service { 
    public Action Callback { get; set; } 
    public ISynchronizeInvoke SynchronizationObject { get; set; } 

    public void DoWork() { 
     //... 
     var cb = Callback; 
     if (cb != null) { 
      if (SynchronizationObject == null) cb(); 
      else SynchronizationObject.BeginInvoke(cb, null); 
     } 
    } 
} 
0

(それは実際にMonoDroidを使ってAndroidのアプリケーションを実行している)のWinFormsについて何も知らない、あなたはコールバックとしてデリゲートを渡すべきではありません、それは単に動作しません。

代わりに、クライアントが実装してサービスに渡す契約を定義する必要があります(WCFはcallback contractsです)。サービスはコールバックを呼び出します。

コールされると、クライアントのコールバックの実装がトリガーされます。クライアントがUIを変更するのは、の実装です。アプリ内ドメイン呼び出しを経由するコールバックのほとんどは、デフォルトで呼び出されたスレッドにはないことに注意してください。 UIスレッドへの呼び出しをマーシャリングすることによって、UIの変更を必ず実行してください。

関連する問題