为什么多线程访问WPFUI控件的开销很大?在开发需要编写大量重复代码的多线程应用程序时,我是否遗漏了WPF(以及之前的Windows窗体)中的某些内容。应用程序中的每个UI控件最终都需要一行额外的代码来获取和设置每个属性。内部委托voidSetElementIsEnabledDelegate(UIElement元素,boolisEnabled);内部委托voidSetBrushesAndTextDelegate(BrushforegroundBrush,stringmessage);内部委托voidSetCheckBoxCheckedDelegate(CheckBoxcheckbox,boolcheckedValue);内部委托voidSetTextBoxTextDelegate(TextBoxrichTextBox,stringtext);内部委托voidSetRichTextBoxTextDelegate(RichTextBoxtextBox,stringtext);internalstaticvoidSetElementIsEnabled(UIElementelement,boolisEnabled){if(element.Dispatcher.Thread!=Thread.CurrentThread){//执行相同的方法,但这次是在GUI线程上element.Dispatcher.Invoke(DispatcherPriority.Normal,新的SetElementIsEnabledDelegate(SetElementIsEnabled),元素,isEnabled);返回;}element.IsEnabled=isEnabled;添加另外30个委托并重新分配方法。据我所知,没有类型安全的方法来满足所有线程调用需求。这似乎很容易在控件库中引起注意。我做错了什么,如果不是,为什么Microsoft选择不处理控件中调用的线程?那么你当然可以让它更简单。首先,您不需要所有自己的独立委托类型——如果您使用的是.NET3.5,则可以使用内置的Func和Action委托,如果不需要,您可以自己声明它们并通用地使用它们。您可能会考虑的另一件事是编写辅助方法(作为扩展方法,如果您使用的是C#3)然后使用匿名方法(或lambda表达式):internalstaticvoidSetElementIsEnabled(UIElementelement,boolisEnabled)(元素,委托{element.IsEnabled=isEnabled;});}辅助方法是:publicstaticvoidInvokeIfNecessary(UIElementelement,MethodInvokeraction){if(element.Dispatcher.Thread!=Thread.CurrentThread){element.Dispatcher。调用(DispatcherPriority.Normal,动作);}else{动作();(您可能还应该包括等效的BeginInvoke。我通常更喜欢BeginInvoke,除非我需要一个集合点。)简单地说,出于性能原因。为什么每个GUI应用程序只在多线程需要时才承担编组代码的性能损失?此外,您可以将应用程序设计为具有较少的跨线程聊天,从而需要较少的调用。此外,您的代码不是特别有效。更好的方法是:if(InvokeRequired){Invoke(newMethodInvoker(this.Function));}else{//docode}编辑:我想我的代码更多是针对Windows窗体的,而你的是WPF,但目的是一样的。由于线程本地存储问题,Windows要求所有控件更新发生在创建控件的线程上。这并不适用于所有用途。不要忘记lambda:intmyParam=5;Dispatcher.BeginInvoke((Action)(()=>SomeMethod(myParam)));dispatcher上还有一个隐藏的intellisense方法:以上是C#学习教程:为什么多线程访问WPFOverheadofUIcontrols?所有分享的内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——if(Dispatcher.CheckAccess())DoSomething();本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处:
