私はWPFアプリケーションを構築しています。サーバー側と非同期通信を行っており、クライアントの Prism でイベント集約を使用しています。これらの両方により、UI スレッドではない新しいスレッドが生成されます。これらのコールバックおよびイベント ハンドラー スレッドで "WPF 操作" を実行しようとすると、世界がバラバラになります。
最初に、サーバーからのコールバックでいくつかの WPF オブジェクトを作成しようとして問題に遭遇しました。スレッドは STA モードで実行する必要があると言われました。今、Prism イベント ハンドラーでいくつかの UI データを更新しようとしていますが、次のように言われました。
別のスレッドがこのスレッドを所有しているため、呼び出し元はこのスレッドにアクセスできません。
そう; WPF で物事を正しく行うための鍵は何ですか? この MSDN の投稿で WPF Dispatcher について調べました。私はそれを理解し始めていますが、私はまだ魔法使いではありません.
- UIスレッドで呼び出されるかどうかわからない何かを実行する必要がある場合、常に Dispatcher.Invoke を使用することが重要ですか?
- それが実際に UI スレッドで呼び出されたかどうかは重要ですか? とにかく Dispatcher.Invoke を実行しますか?
- Dispatcher.Invoke = 同期的に。Dispathcher.BeginInvoke = 非同期?
- Dispatcher.Invoke は UI スレッドを要求し、停止して待機しますか? それは悪い習慣であり、反応の悪いプログラムのリスクですか?
- とにかくディスパッチャーを取得するにはどうすればよいですか?Dispatcher.CurrentDispatcher は常に UI スレッドを表すディスパッチャを提供しますか?
- 複数の Dispatcher が存在しますか、それとも "Dispatcher" は基本的にアプリケーションの UI スレッドと同じですか?
- そして、BackgroundWorker との取引は何ですか? 代わりにいつこれを使用しますか? これは常に非同期だと思いますか?
- UI スレッドで (Invoked によって) 実行されるものはすべて STA アパートメント モードで実行されますか? つまり、STA モードで実行する必要がある場合、Dispatcher.Invoke で十分でしょうか?
私のために物事を明確にしたい人はいますか?関連する推奨事項などはありますか?ありがとう!