0

wpf アプリケーションで BackgroundWorker を使用して一括コピー操作を行っています。ワーカースレッドから以下のように DoAction メソッドを呼び出します

private void DoAction()
  {

     .....................
     .....................   // some code goes here and works fine

     //Enable the Explore link to verify the package
     BuildExplorer.Visibility = Visibility.Visible; // here enable the button to visible and gives error
  }

最後にBuildExplorerボタンの可視性を表示すると、「別のスレッドが所有しているため、呼び出しスレッドはこのオブジェクトにアクセスできません」というエラーが表示されました。UI スレッドのステータスを更新するにはどうすればよいですか?

4

2 に答える 2

2

WPF の UI スレッドから UI を変更することのみが合法です。可視性の変更などのアクションは UI の変更であり、バックグラウンド ワーカーから実行することはできません。UIスレッドからこれを行う必要があります

WPF でこれを行う最も一般的な方法は次のとおりです。

  • Dispatcher.CurrentDispatcherUI スレッドでのキャプチャ
  • Invokeバックグラウンド スレッドからキャプチャされた値を呼び出して、UI スレッドで作業を行う

例えば

class TheControl { 
  Dispatcher _dispatcher = Dispatcher.CurrentDispatcher;

  private void DoAction() {
    _dispatcher.Invoke(() => { 
      //Enable the Explore link to verify the package
      BuildExplorer.Visibility = Visibility.Visible;
    });
  }
}
于 2013-03-11T06:33:22.590 に答える
0

別のスレッドからアクセスしている場合は、コントロール アクセスをマーシャリングしてください。Windows や他の多くの OS では、コントロールはそれが生まれたスレッドによってのみアクセスできます。別のスレッドからいじることはできません。WPF では、ディスパッチャーを UI スレッドに関連付ける必要があり、ディスパッチャーを介してのみ呼び出しをマーシャリングできます。

BackgroundWorker クラスを使用して完了通知を取得するよりも長時間実行されるタスクの場合

var bc = new BackgroundWorker();
    // showing only completed event handling , you need to handle other events also
        bc.RunWorkerCompleted += delegate
                                     {
                                        _dispatcher.Invoke(() => { 
                                        //Enable the Explore link to verify the package
                                        BuildExplorer.Visibility = Visibility.Visible;
                                     };
于 2013-03-11T06:36:56.943 に答える