1 / 17
文档名称:

[WPF]+跨线程控制窗体UI.doc

格式:doc   大小:56KB   页数:17页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

[WPF]+跨线程控制窗体UI.doc

上传人:wxc6688 2020/3/7 文件大小:56 KB

下载得到文件列表

[WPF]+跨线程控制窗体UI.doc

相关文档

文档介绍

文档介绍:[WPF]跨线程控制窗体UI呼叫线程无法存取此对象在WPF、WinForm这些应用程序中,必需是UI线程才能控制窗体。如果像是下列的范例程序一样,使用了非UI线程来控制窗体,那就会看到内容为「呼叫线程无法存取此对象,因为此对象属于另外一个线程」的InvalidOperationException例外错误。?123456<Windowx:Class=""xmlns=""xmlns:x=""Title="MainWindow"Height="350"Width="525"><TextBlockx:Name="TextBlock001"FontSize="72"/></Window>  ?12345678910111213141516171819202**********namespaceWpfApplication1{publicpartialclassMainWindow:Window{//=null;privateint_count=0;//ConstructorspublicMainWindow(){//ponent();//Timer_timer=(,null,0,100);}//HandlersprivatevoidTimer_Ticked(ObjectstateInfo){_count++;=();}}}272829  使用Dispatcher对象跨线程非UI线程如果要控制窗体,必须要将控制窗体的程序逻辑封装成为委派,再将这个委派提交给UI线程去执行,藉由这个流程非UI线程就能够跨线程控制窗体。而在WPF应用程序中,非UI线程可以透过WPF提供的Dispatcher对象来提交委派。参考数据:MSDN-使用Dispatcher建置响应性更佳的应用程序昏睡领域-[Object-oriented]线程?123456<Windowx:Class=""xmlns=""xmlns:x=""Title="MainWindow"Height="350"Width="525"><TextBlockx:Name="TextBlock001"FontSize="72"/></Window>  ?12345678910111213141516171819202122232425262728namespaceWpfApplication2{publicpartialclassMainWindow:Window{//=null;privateint_count=0;//ConstructorspublicMainWindow(){//ponent();//Timer_timer=(,null,0,100);}//HandlersprivatevoidTimer_Ticked(ObjectstateInfo){_count++;ActionmethodDelegate=delegate(){=();};(methodDelegate);}}}2930313233  使用SynchronizationContext类别跨线程在WPF应用程序中可以透过WPF提供的Dispatcher对象来完成跨线程工作,而在WinForm应用程序中则是需要透过WinForm提供的Invoke方法、BeginInvoke方法来完成跨线程工作。以此类推能得知Silverlight、WindowsPhone等等应用程序平台,也会提供对应的解决方案来让开发人员完成跨线程工作。每个应用程序平台都提供各自的跨线程解决方案这件事,对于开发共享函式库、框架的开发人员来说,就代表了要花不少的精力才能让函式库、框架适用于各种应用程序平台。为了整合不同平台跨线程的解决方案,Framework中将这些解决方案抽象化为统一的SynchronizationContext类别,再由各个应用程序平台去提供对应的实作。自此之后开发共享函式库、共享框架的开发人员,只要透过SynchronizationContext类别,就能完成适用于不同平台的