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.CurrentDispatcher在 UI 线程中捕获
  • 从后台线程调用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 和许多其他操作系统中,一个控件只能由它所在的线程访问。你不能从另一个线程摆弄它。在 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 回答