当试图获取comboBox的值时,"Cross-threadoperationisnotvalid"exception"notvalid"异常我经历过很多次这种异常,但所有这些时候我都在设置控件的值。就在那时,我使用一个名为SetControlPropertyThreadSafe()的函数解决了这个问题,该函数仅由stackoverflow.com上的某人建议。但是这次我在尝试获取组合框的值时遇到了这个异常。这是代码:字符串猫;privatevoidbutton1_Click(objectsender,EventArgse){if(textBox1.Text.Trim().Length>20){System.Threading.Threadt=newSystem.Threading.Thread(addQuickTopic);t.开始();}elseMessageBox.Show("标题长度必须大于20","标题长度无效",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);}公共字符串tTitle="";voidaddQuickTopic(){Global.SetControlPropertyThreadSafe(button1,"Text","Working...");Global.SetControlPropertyThreadSafe(button1,"Enabled",false);主题t=新主题();t.setTitle(textBox1.Text);t.setDescription("");t.setDesID(Global.getMd5Hash(Common.uid+DateTime.Today.ToString()+DateTime.Today.Millisecond.ToString()));t.setUsrID(Common.uid);t.setReplyToID("");t.setConDate("0");cat=CategoryList.SelectedValue.ToString();如您所见,我直接获取了textBox1.Text,没有应用任何线程安全操作。但是在最后一行尝试获取组合框的选定值时,我得到了这个异常。那么有人可以建议我在这种情况下该怎么做吗?这是我的线程安全函数的代码,用于设置控件的值:publicstaticvoidSetControlPropertyThreadSafe(Controlcontrol,stringpropertyName,objectpropertyValue){,新对象[]{控件,propertyName,propertyValue});}else{control.GetType().InvokeMember(propertyName,BindingFlags.SetProperty,null,control,newobject[]{propertyValue});}}catch(Exception){}}我需要创建一个类似的get函数吗?或任何其他解决方案?现在,您通过以下方式从TextBox获取值:t.setTitle(textBox1.Text);.这也会失败。我需要创建一个类似的get函数吗?或任何其他解决方案?是的,你需要一个选择。但是,我建议放弃反射和文字并重新设计它以使用通用方法和lambda。publicstaticvoidSetControlPropertyThreadSafe(Tcontrol,Actionaction)whereT:Control{if(control.InvokeRequired){control.Invoke(action);}else{动作();这将允许您编写此强类型,即:Global.SetControlPropertyThreadSafe(button1,b=>b.Text="Working...");您还可以创建一个强类型的get方法:publicstaticUGetControlPropertyThreadSafe(Tcontrol,Funcfunc)whereT:Control{if(control.InvokeRequired){return(U)control.Invoke(func,newobject[]{control});}else{返回函数(控制);然后让你写:t.setTitle(Global.GetControlPropertyThreadSafe(textBox1,t=>t.Text));您还可以使用相同的方法来获取和设置组合框项目。您需要一个类似的get函数,在需要时调用Invoke。这取决于GUI的线程模型,该模型声明与GUI交互的所有方法都应仅由GUI线程调用。无论您是在尝试阅读、写作还是做任何其他事情,都没有关系。如果您不在GUI线程上,则必须使用Invoke。以上就是C#学习教程:尝试获取comboBox的值时,“跨线程操作无效”异常分享的全部内容。如果对大家有用,需要了解更多C#学习教程,希望大家多多关注——本文来自网络合集,不代表立场,如涉及侵权,请右击联系管理员删除。如需转载请注明出处:
