使用MethodInvokerWithoutInvoke使用MethodInvokerWithoutInvoke我写GUI应用程序有一段时间了,我一直使用的一种方法是使用MethodInvoker+lambda函数进行跨线程访问。从我看到的例子中,我总是看到这样的东西:Version1if(InvokeRequired){Invoke(newMethodInvoker(()=>{Label1.Text="Foobar";});}else{Label1.Text="Foobar";}但是,这会导致代码重复-->对我来说是主要的坏人。那怎么了?版本2MethodInvokerupdateText=newMethodInvoker(()=>{Label1.Text="Foobar";});if(InvokeRequired){Invoke(updateText);}else{updateText();}现在我将函数捆绑在一个变量中,并在适当的时候使用Invoke或函数指针调用它。版本2更糟吗?或者这对我来说是不好的做法使用匿名函数?没有错......但是你可以添加一个扩展方法来让它更好一点:publicstaticvoidInvokeIfNecessary(thisControlcontrol,MethodInvokeraction){}else{action();}}然后你可以这样写:this.InvokeIfNecessary(()=>Label1.Text="Foobar");更简洁:)在你不需要的时候创建委托会有非常轻微的表现命中,但这几乎可以肯定是无关紧要的——专注于编写干净的代码。请注意,即使您不想这样做,您仍然可以在现有代码中简化变量声明:MethodInvokerupdateText=()=>Label1.Text="Foobar";这是使用单独变量的好处——您不需要新的MethodInvoker位来告诉lambda表达式您想要什么类型的委托……版本2是否更糟?还是我使用匿名函数是不好的做法?没有版本2更好,不用担心它的性能问题。您还可以定义一个方法而不是使用匿名函数:publicvoidSetLabelTextToFooBar(){Label1.Text="Foobar";}然后:如果(InvokeRequired){调用(SetLabelTextToFooBar);}else{SetLabelTextToFooBar();或者只使用一个BackgroundWorker,它会在主UI线程上自动执行所有回调(例如RunWorkerCompleted和ProgressChanged),因此您不需要检查InvokeRequired。另一种方法:以上是C#学习教程:使用MethodInvoker分享的所有内容,无需Invoke。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注—Invoke((MethodInvoker)delegate{Label1.Text="Foobar";});本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
