クライアントからAction<> CallBack
が送信されたServiceクラスがあります。メインUIスレッドをサービスから呼び出す方法
メインUIスレッドでAction<> CallBack
を呼び出すにはどうすればいいですか?クライアントがUIスレッドでコールバックを取得するにはどうすればいいですか。サービスは、アプリケーションドメイン(WCF、Remotingを)交差何をやっていると仮定すると
クライアントからAction<> CallBack
が送信されたServiceクラスがあります。メインUIスレッドをサービスから呼び出す方法
メインUIスレッドでAction<> CallBack
を呼び出すにはどうすればいいですか?クライアントがUIスレッドでコールバックを取得するにはどうすればいいですか。サービスは、アプリケーションドメイン(WCF、Remotingを)交差何をやっていると仮定すると
通常、スレッド化に対処するために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);
}
}
}
(それは実際にMonoDroidを使ってAndroidのアプリケーションを実行している)のWinFormsについて何も知らない、あなたはコールバックとしてデリゲートを渡すべきではありません、それは単に動作しません。
代わりに、クライアントが実装してサービスに渡す契約を定義する必要があります(WCFはcallback contractsです)。サービスはコールバックを呼び出します。
コールされると、クライアントのコールバックの実装がトリガーされます。クライアントがUIを変更するのは、のの実装です。アプリ内ドメイン呼び出しを経由するコールバックのほとんどは、デフォルトで呼び出されたスレッドにはないことに注意してください。 UIスレッドへの呼び出しをマーシャリングすることによって、UIの変更を必ず実行してください。
あなたの質問はあまり明確ではありません。サービスはWinFormsとはどのように通信しますか? –
あなたが「サービス」と言うとき、あなたは何を話していますか? –