我在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线程状态?
答案 0 :(得分:2)
从WPF中的UI线程修改UI是合法的。更改visiblity等操作正在修改UI,无法从后台工作程序完成。您需要从UI线程
执行此操作在WPF中执行此操作的最常见方法如下
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;
};