工作线程未更新按钮的可见性状态

时间:2013-03-11 06:31:31

标签: c# wpf c#-4.0 wpf-controls

我在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线程状态?

2 个答案:

答案 0 :(得分:2)

从WPF中的UI线程修改UI是合法的。更改visiblity等操作正在修改UI,无法从后台工作程序完成。您需要从UI线程

执行此操作

在WPF中执行此操作的最常见方法如下

  • 在UI线程中捕获Dispatcher.CurrentDispatcher
  • 从后台线程调用捕获的值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;
    });
  }
}

答案 1 :(得分:0)

如果您从不同的线程访问,请封送控制访问权限。在Windows和许多其他操作系统中,A控件只能由其生成的线程访问。你不能从另一个线程中捣乱它。在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;
                                     };