2012-04-25 11 views
4

私のメインウィンドウ(スレッドA)では、ユーザーが待機している間に新しいスレッド(スレッドB)を起動します。別のスレッドのイベントを起動する

スレッドB火災イベントエラーや余分な情報は、ユーザーから要求されるがある場合、スレッドAは、これらのイベントに耳を傾けます。スレッドAのイベントリスナーで

は私が私がカスタムダイアログウィンドウを持っており、それがdialogWindow.showDialog()を使用して表示し、ユーザーにダイアログメッセージを表示する必要があります。これは正常に動作しますが、ダイアログのオーナーを設定しようとするとエラーが発生します。私はこれを行いますdialogWindow.Owner = Window.GetWindow(this)

私が手にエラーがある:別のスレッドがそれを所有しているので、呼び出し元のスレッドがこのオブジェクトにアクセスすることはできません。

別のスレッドから発生するイベントをリッスンする正しい方法は何ですか?

答えて

3

バックグラウンドスレッドからUIスレッドにイベントを発生させる正しい方法は、そのディスパッチャでイベントを発生させることです。 ここでは、手前のUIthreadのディスパッチャを取得します。

UIDisaptcher.BeginInvoke((ThreadStart)(>)> RaiseEventToUIThread());

UIスレッドが発生したイベントをリッスンするとき、(UIスレッドによってウィンドウが作成されたので)Ownerプロパティを設定できます。

+0

ありがとう、素晴らしい作品。 BeginInvokeではなくInvokeを使用していますが、同じことです。 – Drahcir

+2

BeginInvokeを使用してください。Invokeはハンドルを解放しません。 – peterincumbria

3

は確かに - >私たちがやっていることのSynchronizationContextを使用することです。 新しいスレッドを開始すると、(UIスレッドで)現在のコンテキストを取得し、パラメータとして2番目のスレッドに渡します。

は、その後、あなたがそれを行うイベントをこのように上げるしたい第二のスレッド上:

if (_uiThreadId != Thread.CurrentThread.ManagedThreadId) 
    { 
     _uiContext.Post(
      new SendOrPostCallback(delegate(object o) { OnYourEvent((EventArgs)o); }), 
      e); 
    } 
    else 
     OnYourEvent(e); 
+0

本当に素晴らしい解決策です。同期コンテキスト、素晴らしいリファレンスについて知りません!いいぞ! – inva

7

イベントリスナーのコードがイベントを発生させたスレッドで暗黙的に実行されますので、イベントリスナーではありませんスレッドバインド。

あなたがイベント処理の結果としてUIで何かを表示したい場合は、マーシャリングを自分で行う必要があります。そのような何か:だから

void OnEvent(object sender, EventArgs args) 
{ 
    // runs in the event sender's thread 
    string x = ComputeChanges(args); 
    Dispatcher.BeginInvoke((Action)(
     () => UpdateUI(x) 
    )); 
} 

void UpdateUI(string x) 
{ 
    // runs in the UI thread 
    control.Content = x; 
    // - or - 
    new DialogWindow() { Content = x, Owner = this }.ShowDialog(); 
    // - or whatever 
} 

:あなたはUIを触れることなく、できれバックグラウンドスレッドでは(もしあれば)あなたの計算を実行します。その後、UIで必要な変更がわかったら、UIスレッドでUI更新コードを実行します。 Dispatcher

は、コントロールのプロパティですので、あなたのコードは、UIの一部である場合、あなたは自由のためのあなたのディスパッチャがあるでしょう。そうでない場合は、任意のコントロール(例:control.Dispatcher)からディスパッチャを利用できます。

関連する問題