【发布时间】:2010-10-08 14:57:55
【问题描述】:
我有在 BackgroundWorker 中执行一些计算的 WPF 应用程序。问题是当我尝试在 RunWorkerCompleted 事件处理程序中更新属性(在 setter 中调用 NotifyPropertyChanged)时,我得到 InvalidOperationException - The calling thread cannot access this object because a different thread owns it.
This MSDN article 说 BackgroundWorker 自己处理线程同步,所以我不应该关心使用 Dispatcher。但我发现它没有正确处理 NotifyPropertyChanged。
谁能帮我解决这个问题?
编辑
这是我的代码(对一些不相关的功能感到抱歉):
backgroundWorker.DoWork += delegate(object sender, DoWorkEventArgs args)
{
var action = (Func<Bitmap>) args.Argument;
args.Result = BitmapUtil.BitmapSourceFromBitmap(action());
};
backgroundWorker.RunWorkerCompleted += delegate(object sender, RunWorkerCompletedEventArgs args)
{
if (args.Cancelled || (args.Error != null))
{
return;
}
ImageProcessed = (BitmapSource) args.Result;
};
...
public BitmapSource ImageProcessed
{
get { return imageProcessed; }
set
{
imageProcessed = value;
OnPropertyChanged(VMUtil.GetNameOf<ImageAnalyzerViewModel>(vm => vm.ImageProcessed));
}
}
【问题讨论】:
-
请显示一些关于您如何设置属性的代码。文章有点误导,DoWork函数中的对象在另一个线程中,不能直接在线程外使用。
标签: wpf thread-safety backgroundworker