0

バックグラウンド ワーカーを使用して、バックグラウンド スレッドでビューモデルからサービス モジュール呼び出しを呼び出しています。

サービス モジュール メソッドには、サービスが返されたときに呼び出されるアクション パラメータがあります。ここで、UI スレッドに戻ってアクションを呼び出す必要があります (サービス モジュールから呼び出されるビューモデル メソッドで UI スレッドに戻ることも試みました)。

だから私が試した問題の核心に

Application.Current.RootVisual.Dispatcher.BeginInvoke(() => code stuff here);

これにより、無効なクロス スレッド アクセスが生成されます (ここで rootvisual にアクセスできません)。

次に、以下のように別の方法で Dispatcher を取得しようとしました

Deployment.Current.Dispatcher.BeginInvoke() => code here);

また、アプリケーションの起動メソッドで設定した Dispatcher プロパティを持つ静的クラスを試し、それを使用して呼び出しを試みました。

Deployment ディスパッチャと静的クラスのディスパッチャを使用しても無効なクロス スレッド アクセスは生成されませんが、これらのディスパッチャによって呼び出されているコード内でブレークポイントを設定すると、このSystem.Threading.Thread. CurrentThread.ThreadState はバックグラウンドです

ただし、ビュー モデルでプロパティを更新することはできますが、ビューは実際に問題なく更新されますが、ここでまだ問題が発生しているかどうかを知りたいのですが、これは将来的に問題になるでしょう。

4

1 に答える 1

2

UI ディスパッチャにアクセスするには、次のコードを使用できます -

Application.Current.Dispatcher.BeginInvoke() => code here);

あなたのコメントのために -

最も紛らわしい部分は、ディスパッチャーを使用して読んだことから追加する必要があります。これは、UI スレッドに戻ることを保証することを目的としています!

UI ディスパッチャーでデリゲートを呼び出すと UI スレッドに移動すると誤解しています。上記のコード呼び出しは、UI ディスパッチャーでデリゲートをキューに入れるだけで、UI スレッドで実行されます。ただし、実行ポイントは、このアクションを呼び出しているバックグラウンド スレッドにあります。

これらのリンクは役に立つかもしれません - DispatcherとDispatcher の概要について

于 2012-07-21T17:29:53.950 に答える