在我正在编写的 WPF 应用程序中,我有一个 TransformedBitmap 属性,该属性绑定到 UI 上的 Image 对象。每当我更改此属性时,图像就会更新(因此显示在屏幕上的图像也会更新)。为了防止在检索下一张图像时 UI 冻结或变得无响应,我尝试使用 BackgroundWorker 进行快照检索,如下所示:
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
e.Result = this.snapshotHelper.GetSnapshot(ImageFormat.Bmp);
}
然后,在我的 RunWorkerCompleted 方法中,我有以下内容:
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.CurrentImage = (TransformedBitmap)e.Result;
....
}
这似乎工作正常,直到使用 INotifyPropertyChanged 方法来告诉 Image 对象在我更新 Current Image 属性时进行更新;我收到跨线程错误。
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
//The following causes a "the calling thread cannot access this object because a different thread owns it" error!
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
我真的不知道如何改变周围的情况,也不知道如何采取不同的措施来解决此错误。在过去的几个小时里,我一直在阅读有关BackgroundWorkers的内容,在我看来,我应该能够在RunWorkerCompleted方法中很好地设置CurrentImage;至少据我所知。对此的任何帮助将不胜感激!谢谢!
Dispatcher.Invoke((Action<TransformedBitmap>) (obj => this.CurrentImage = obj), e.Result as TransformedBitmap);
这应该有效...
Update
在您的情况下,您使用的是可冻结对象,问题在于您创建的位图需要在 UI 线程中发送之前冻结。所以你的DoWork将如下所示:
void worker_DoWork(object sender, DoWorkEventArgs e)
{
var bmp = snapshotHelper.GetSnapshot(ImageFormat.Bmp);
bmp.Freeze();
e.Result = bmp;
}
然后在 RunWorkerCompleted 中,按照我上面写的那样更新属性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)