从BackgroundWorker线程更新ImageUI属性在我写的WPF应用程序中,我有一个TransformedBitmap属性绑定到UI上的Image对象。每当我更改此属性时,图像都会更新(从而更新屏幕上显示的图像)。为了防止UI在检索下一张图像时冻结或变得无响应,我尝试使用BackgroundWorker进行快照检索,如下所示:privatevoidbw_DoWork(objectsender,DoWorkEventArgse){e.Result=this.snapshotHelper.GetSnapshot(图像格式.Bmp);然后,在我的RunWorkerCompleted方法中,我有以下内容:privatevoidbw_RunWorkerCompleted(objectsender,RunWorkerCompletedEventArgse){....}这似乎工作正常,直到当我更新CurrentImage属性时我用来告诉Image对象更新的NotifyPropertyChanged方法;我收到跨线程错误。公共事件PropertyChangedEventHandlerPropertyChanged;privatevoidNotifyPropertyChanged(Stringinfo){if(PropertyChanged!=null){//以下导致“调用线程无法访问此对象,因为另一个线程拥有它”错误!(信息));我真的不知道如何改变周围的事物或做一些不同的事情来修复这个错误。在过去的几个小时里,我一直在阅读有关BackgroundWorkers的信息,在我看来,我应该能够在RunWorkerCompleted方法中设置CurrentImage。至少据我所知。对此的任何帮助将不胜感激!谢谢!Dispatcher.Invoke((Action)(obj=>this.CurrentImage=obj),e.ResultasTransformedBitmap);这应该工作...更新在您的情况下,您使用的是可冻结对象和您正在创建的位图在发送UI线程之前需要冻结的问题。所以DoWork将如下:voidworker_DoWork(objectsender,DoWorkEventArgse){varbmp=snapshotHelper.GetSnapshot(ImageFormat.Bmp);bmp.冻结();e.Result=bmp;然后在RunWorkerCompleted更新我上面写的属性。控件(图像)只能在创建它的线程上更改。基本上发生的事情是您的后台线程更改对象的属性,然后触发PropertyChanged事件,然后由WPF使用,然后尝试修改Image控件(请记住我们仍在整个链中的BackgroundThread事件)。幸好,修复非常简单:...});}您需要引用Window或Control才能使用,但这实际上会将委托排队在UI线程而不是后台线程上运行。只允许调度程序与UI交互。看这里:http://www.jeff.wilcox.name/2010/04/propertychangedbase-crossthread/以上是C#学习教程:从BackgroundWorker线程更新ImageUI属性共享的全部内容,如果它对大家有用,需要详细了解C#学习教程,希望大家多多关注~本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
