C#中使用InvokeFromDifferentThreads访问类成员注:系列的一部分:C#:从另一个类访问表单成员以及如何从另一个类访问表单对象C#中的.cs文件。嗨,这个想法是在TCP客户端接收/发送数据包时使用备忘录通知用户。经过几次修复,最合适的解决方案是这个publicstringTextValue{set{this.Memo.Text+=value+"n";这就是它的调用方式varform=Form.ActiveFormasForm1;if(form!=null)form.TextValue="测试asdasd";但是,调用代码由于不安全的线程调用而抛出异常。我在msdn上找到了一个解决方案,但我似乎无法获得他们在那里使用的方法。这是我的翻拍,但不起作用。privatevoidSetTextMemo(stringtxt){if(this.Memo.InvokeRequired){this.Invoke(SetTextMemo,txt);//这里出错}else{this.Memo.Text+=txt+"n";错误:参数“1”:无法从“方法组”转换为“System.Delegate”参数“2”:无法从“字符串”转换为“对象[]”基本上,我试图从另一个访问备忘录使用Invoke的线程(或者更可能的是,将文本添加到备忘录中)。我以前从未使用过它,也许这就是为什么我误解了我的错误。简单的方法是:this.Invoke((MethodInvoker)delegate{this.Memo.Text+=txt+"n";});它使用匿名方法内联工作。由于您想在另一个线程上,您也可以只调用Invoke-即使从UI线程也是安全的。如果您使用的是C#3.0和3.5框架,请尝试以下操作您的实现假定该方法不会无限递归,因为InvokeRequired特性的行为会阻止它。这个假设可能是正确的,但是在编写函数代码时完全避免这种可能性是没有问题的。这是我的建议:privatevoidSetMemo(stringtxt){Memo.Text=txt;}privatedelegatevoidMemoSetter(stringtxt);publicvoidThreadSafeSet(stringtxt){调用(newMemoSetter(SetMemo),txt);我曾经做过所有这些跨线程业务,但最近我选择了AOP,您只需装饰一个在UI线程上执行的方法。这里有一个例子(来自PostSharp):以上是C#学习教程:在C#中使用不同线程的Invoke来访问类成员共享的所有内容。如果对大家有用,需要详细了解C#学习教程,希望大家多多关注—publicclassFormsThreadAttribute:OnMethodInvocationAspect{publicoverridevoidOnInvocation(MethodInvocationEventArgseventArgs){Formf=(Form)eventArgs.Delegate。目标;如果(f.InvokeRequired)f.Invoke(eventArgs.Delegate.Delegate,GetArgument)(Getevent);否则eventArgs.Proceed();}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
