async / await パターンを使用して、オブジェクトに対して CPU 負荷の高い操作を実行しています (私のメソッドは待機可能です)。これは、UI スレッドをブロックすることなく想定どおりに動作します。
ただし、オブジェクトをパラメーターとして新しいウィンドウの ctor に渡すと (新しいウィンドウは、処理されたオブジェクトへのアクセスが必要なログ ウィンドウです)、UI スレッドがブロックされます (理由はわかります)。
これを回避するには、計算の実行を
Task.Run(async () => { await _myObject.PerformCalculations(); });
そして、単に呼び出す
var logWindow = new LogWindow(_myObject);
logWindow.Show();
これは (もちろん) 機能しますが、オブジェクトがイベントを発生させたときに多くのディスパッチャー呼び出しが発生しますが、Task.Run 呼び出しなしで処理できれば対処する必要はありません。
それで、私の質問は、どうにかして Task.Run 呼び出しを行わずに、UI スレッドをブロックせずにオブジェクトをログ ウィンドウに渡すことができるかということです。
編集
簡素化された例で申し訳ありません。実際には、質問をできるだけ簡単に理解できるようにするつもりでしたが、惨めに失敗しました。
より一般的に言えば、特定の条件でイベントを発生させるオブジェクトがあります。イベントが発生したら、UI を更新したいと考えています。イベントは、Task.Run(...) を使用して作成されたスレッドから常に発生します。したがって、ディスパッチャーは UI スレッドを呼び出します。そのため、async / await (既に動作しています) を使用して計算を実行し、オブジェクトをログ ウィンドウ (ブロック) に渡したいと考えています。
Task.Run を使用すると、もちろんすべてが機能しますが、UI スレッドからオブジェクトのイベントをサブスクライブする場合は常に、Task.Run が作成したスレッドからイベントが発生するため、UI スレッドへのディスパッチャー呼び出しを使用する必要があります。これらのディスパッチャー呼び出しは避けたいと思います。実際、オブジェクトをロギング ウィンドウに渡さずに Show() メソッドを呼び出すと、UI スレッドはブロックされず、すべてが想定どおりに機能します。イベント ハンドラでディスパッチャを呼び出す必要はありません。