Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Dispatcher中访问WPF对象?_Wpf_Multithreading_Mvvm_Backgroundworker - Fatal编程技术网

如何在Dispatcher中访问WPF对象?

如何在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

我正在使用MVVM模式开发WPF应用程序

应用程序从服务器加载验证码图像,并分配给它 准备好后,将其复制到WPF表单上的图像。我正在使用 BackgroundWorker为我做线程处理,如下所示:

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线程得到最多关注并不断更新。。