コードでロックを使用することについて非常に悪い気持ちがありますが、WindowBaseのディスパッチャーが存在し、どこでも使用したいと思っています。
たとえば、PRISMのEventAggregatorでイベントを公開するマルチスレッドシングルトンWCFサービスを使用すると、ペイロードは不変であり(データのみ)、ディスパッチャーを持つすべてのスレッドは、独自のディスパッチャーでデッドロックが発生することなく、イベントを適切に取得できます。(UIスレッドだけでなく、データベース呼び出しのあるスレッド、サービス呼び出しのあるスレッド、ログに記録するスレッド、またはUIをフリーズしたくないため、遅い呼び出しのある他のスレッドもあります)。
しかし、私の問題は、このディスパッチャーがWPFと結合されているため、どこでも使用すると少し罪悪感を感じることです。ディスパッチャーは、私のユースケース用に作成されたものではないと感じています。
WPFと組み合わせていない別のDispatcher実装が存在しますか?またはそれを悪用しても大丈夫ですか?
ありがとう、
アップデート
Paul Stovellが私に提供する解決策は、インターフェイスIDispatcherとWpf Dispatcherのアダプターを作成することです。これにより、テストが容易になります。このソリューションは、テストをリファクタリングし、テストでSynchronousDispatcherAdapterを使用できるようになったため、私にとっては良かったです(おかげで、テストでWPFのディスパッチャーを使用する必要がなくなりました)。
マルチパブリッシャー/サブスクライバーパターン(PRISMを使用)を使用しているため、BackgroundWorkerの代わりにDispatcherを使用することは理にかなっています。また、Dispatcherのおかげで、すべてのイベントハンドラーは、イベントにサブスクライブするスレッドで呼び出されます。これは、マルチスレッドの問題が発生する可能性がある唯一のポイントが私のイベントのペイロードにあることを意味します(私は彼を不変にしました)。
私のさまざまなスレッドは、それらの間で直接通信するのではなく、イベントをパブリッシュおよびサブスクライブするだけです。したがって、データベース呼び出し、ログ呼び出し、サービス呼び出し、UI呼び出しは異なるスレッドで実行され、相互に認識しません(サブスクライブしてパブリッシュするイベントについてのみ認識します)。
UIからリポジトリにいくつかの呼び出しを行う場合、バックグラウンドワーカーは理にかなっています。
しかし、私はこのサブスクライバー/パブリッシャーパターンを使用することを好むため、BackgroundWorkerを使用せずにデザインを見つけたいと思っています(コードが読みやすくなると思います)