如何在Dispatcher中访问WPF对象?
我正在使用MVVM模式开发WPF应用程序 应用程序从服务器加载验证码图像,并分配给它 准备好后,将其复制到WPF表单上的图像。我正在使用 BackgroundWorker为我做线程处理,如下所示:如何在Dispatcher中访问WPF对象?,wpf,multithreading,mvvm,backgroundworker,Wpf,Multithreading,Mvvm,Backgroundworker,我正在使用MVVM模式开发WPF应用程序 应用程序从服务器加载验证码图像,并分配给它 准备好后,将其复制到WPF表单上的图像。我正在使用 BackgroundWorker为我做线程处理,如下所示: Application.Current.Dispatcher.Invoke( new Action(() => CaptchaBitmap = _tempBitmap)); 加载窗口时,将调用以下命令: BackgroundWorker _bgWorker = new BackgroundWo
Application.Current.Dispatcher.Invoke(
new Action(() => CaptchaBitmap = _tempBitmap));
加载窗口时,将调用以下命令:
BackgroundWorker _bgWorker = new BackgroundWorker();
_bgWorker.DoWork += GetCaptchaImage;
_bgWorker.RunWorkerAsync();
GetCaptchaImage函数相当简单,只需加载一个图像
在另一个线程中:
BitmapSource _tempBitmap = GetCaptchaFromServer();
我需要知道如何调用Dispatcher来分配这个
ImageSource到我窗口的图像源,当前我调用
加载_tempBitmap后的dispatcher如下所示:
Application.Current.Dispatcher.Invoke(
new Action(() => CaptchaBitmap = _tempBitmap));
其中CaptchaBitmap数据绑定到我的图像源
但是,当我这样做时,会抛出一个InvalidOperationException,
任何对_tempBitmap的引用都会在GUI中返回一个错误
线我知道这是因为我正在从调度程序访问它
GUI线程,当它在BackgroundWorker线程中创建时,但是如何创建
我能绕开它吗
非常感谢您的帮助!:) 我也有同样的问题
还没有弄明白什么是“正确”的解决方案。最终用一个只运行一次的调度程序替换了我的BackgroundWorker 我也有同样的问题
还没有弄明白什么是“正确”的解决方案。最终用一个只运行一次的调度程序替换了我的BackgroundWorker 只是出于好奇。。为什么不在Dispatcher线程而不是BackgroundWorker类中检索和设置映像
Dispatcher.Invoke(DispatcherPriority.Background,
new Action(() => { CaptchaBitmap = GetCaptchaFromServer(); } )
);
只是出于好奇。。为什么不在Dispatcher线程而不是BackgroundWorker类中检索和设置映像
Dispatcher.Invoke(DispatcherPriority.Background,
new Action(() => { CaptchaBitmap = GetCaptchaFromServer(); } )
);
只需调用BitmapSource.Freeze,然后再调用Dispatcher.Invoke
BitmapSource _tempBitmap = GetCaptchaFromServer();
_tempBitmap.Freeze();
Application.Current.Dispatcher.Invoke(
new Action(() => CaptchaBitmap = _tempBitmap));
所有WPF对象只能从创建它们的线程中访问,异常是Dispatcher(出于明显的原因)并且在调用冻结方法后可以冻结
调用Freeze后,可以从任何线程访问对象(但不能修改),幸运的是BitmapSource继承自Freezable。只需在调用Dispatcher.Invoke之前调用BitmapSource.Freeze即可
BitmapSource _tempBitmap = GetCaptchaFromServer();
_tempBitmap.Freeze();
Application.Current.Dispatcher.Invoke(
new Action(() => CaptchaBitmap = _tempBitmap));
所有WPF对象只能从创建它们的线程中访问,异常是Dispatcher(出于明显的原因)并且在调用冻结方法后可以冻结
调用Freeze后,可以从任何线程访问对象(但不能修改),幸运的是BitmapSource继承自Freezable。@Arcturus,
根据我的经验,如果你这样做,在从服务器下载完成之前,你不会得到任何UI响应…因为你实际上是在中断UI线程,然后下载东西…我在我的几个项目中犯了这个错误,并且想知道为什么UI没有响应…@Arcturus,
根据我的经验,如果你这样做,在从服务器下载完成之前,你不会得到任何UI响应…因为你实际上是在中断UI线程,然后下载东西…我在我的几个项目中犯了这个错误,并且想知道为什么UI没有响应…我最近一直在扯头发这个问题花了一个小时。谢谢你!过去一个小时我一直在为这个问题焦头烂额。谢谢你!是的,那是真的。。这就是为什么我通常在后台线程中进行工作,以便UI线程得到最多关注并不断更新..是的,这是真的。。这就是为什么我通常在后台线程中进行工作,以便UI线程得到最多关注并不断更新。。