当前位置: 首页 > 编程语言 > C#

解决WinForms中的跨线程异常分享

时间:2023-04-11 03:05:09 C#

解决WinForms中的跨线程异常目前我正在使用WinForms(在C#中),我必须在后台运行应用程序。为此,我使用异步。当我运行该应用程序时,它显示异常“无效的跨线程操作:从创建它的线程以外的线程访问控件。我该如何解决这个错误?对控件进行方法调用时,如果调用者与创建控件的线程不在同一线程上,您需要使用Control.Invoke进行调用。这是一个代码示例://您可以定义一个具有您想要的签名的委托publicdelegatevoidUpdateControlsDelegate();publicvoidSomeMethod(){//该方法由后台worker执行InvokeUpdateControls();}publicvoidInvokeUpdateControls(){if(this.InvokeRequired){this.Invoke(newUpdateControlsDelegate(UpdateControls));}else{UpdateControls();}}privatevoidUpdateControls(){//在此处更新您的控件}希望这会有所帮助。在大多数情况下,执行此类操作的最佳方法是使用WinForms。执行此操作的最佳方法是使用BackgroundWorker,这将在后台线程上运行您的工作,但为您提供了一种向UI报告状态的简洁方法。在很多日常的.NET编程中,无论是显式创建线程还是调用.Invoke都表明你没有充分利用框架(当然,做低级的东西有很多正当理由,只是它们不太常见,人们有时会意识到)。您需要检查是否需要调用您尝试更新的控件。像这样:ActionsetterCallback=(toSet,text)=>toSet.Text=text;voidSetControlText(ControltoSet,stringtext){if(this.InvokeRequired){this.Invoke(setterCallback,toSet,text);}else{setterCallback(toSet,text);您可能会发现有用的一种模式是在与GUI交互的函数的顶部进行检查,以查看您是否在正确的线程上运行,并在需要时让函数调用自身。像这样:publicdelegatevoidInvocationDelegate();publicvoidDoGuiStuff(){if(someControl.InvokeRequired){someControl.Invoke(InvocationDelegate(DoGuiStuff));返回;}//GUImanipulationhere}方法当你在正确的线程上时它不会调用自己,但如果你在不同的线程上它会调用自己并返回(所以GUI操作逻辑只被调用一次)。从Invoke更新以启动Invoke//你可以用你想要的签名定义一个委托publicdelegatevoidUpdateControlsDelegate();publicvoidSomeMethod(){//该方法由后台worker执行InvokeUpdateControls();}publicvoidInvokeUpdateControls(){if(this.InvokeRequired){this.BeginInvoke(newUpdateControlsDelegate(UpdateControls));}else{更新控件();}}privatevoidUpdateControls(){//在此处更新您的控件}您可以使用Control.Invoke()方法完成UI更改后,可以使用下面的代码片段解决此跨线程异常。以上就是C#学习教程:解决WinForms跨线程异常分享的全部内容。如果对大家有用,需要详细了解C#学习教程,希望大家多多关注——voidUpdateWorker(){//这里的ddUser是用户控件//要执行的Actionshouldbecalledwithin{}就像下面的代码if(this.ddUser.InvokeRequired)ddUser.Invoke(newMethodInvoker(()=>{ddUser.Size=newSize(100,100);}));}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: