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

编写Windows窗体控件线程安全访问方法的最短方法本文分享

时间:2023-04-10 14:45:00 C#

编写Windows窗体控件线程安全访问方法的最短方法:http://msdn.microsoft。com/zh-cn/library/ms171728(VS.80).aspx作者使用如下方法对WindowsForms控件进行线程安全调用:privatevoidSetText(stringtext){//InvokeRequired需要比较线程ID//调用线程到创建线程的线程ID。//如果这些线程不同,则返回true。如果(this.textBox1.InvokeRequired){SetTextCallbackd=newSetTextCallback(SetText);this.Invoke(d,newobject[]{text});}else{this.textBox1.Text=text;有没有更短的方法来完成同样的事情?C#3.0及更高版本:扩展方法通常是可行的方法,因为您总是希望在ISynchronizeInvoke接口实现上执行操作,这是一个很好的设计选择。您还可以利用匿名方法(闭包)来说明您不知道要传递给扩展方法的参数这一事实;关闭将捕获您需要的所有状态。//扩展方法。staticvoidSynchronizedInvoke(thisISynchronizeInvokesync,Actionaction){//如果不需要调用,则在此处调用并退出。if(!sync.InvokeRequired){//执行操作。行动();//出去。返回;}//编组到所需的上下文。同步。调用(动作,新对象[]{});然后你会这样称呼它:privatevoidSetText(stringtext){textBox1.SynchronizedInvoke(()=>textBox1.Text=text);此处,闭包位于文本参数上,此状态被捕获并作为传递给扩展方法的Action委托的一部分传递。在C#3.0之前:你没有lambda表达式的奢侈,但你仍然可以泛化代码。几乎是一样的,但不是扩展方法:staticvoidSynchronizedInvoke(ISynchronizeInvokesync,Actionaction){//如果不需要调用,那么在这里调用并退出。if(!sync.InvokeRequired){//执行操作。行动();//出去。返回;}//编组到所需的上下文。同步。调用(动作,新对象[]{});}然后用匿名方法语法调用它:privatevoidSetText(stringtext){SynchronizedInvoke(textBox1,delegate(){textBox1.Text=text;});}1)使用匿名委托privatevoidSetText(stringtext){if(this.InvokeRequired){Invoke(newMethodInvoker(delegate(){SetText(text);}));}else{this.textBox1.Text=text;}}2)AOP方法[RunInUIThread]privatevoidSetText(stringtext){this.textBox1.Text=text;}http://weblogs.asp.net/rosherove/archive/2007/05.aspx?PageIndex=23)使用lambda表达式(其他人概述)。编辑:我应该提一下,我不认为这是最佳实践如果您使用的是3.5,则可以使用扩展方法来实现以下目的:publicstaticvoidSafeInvoke(thisControlcontrol,Actionhandler){if(control.InvokeRequired){control.Invoke(handler);}else{处理程序();这基本上取自:here然后像这样使用它:textBox1.SafeInvoke(()=>....);当然修改扩展名以供您使用等待。这对大多数人来说可能是显而易见的,但是如果您需要检索该值,您可以采用已接受的答案并添加另一个方法...//执行函数returnfunc();}//编组到上下文return(T)sync.Invoke(func,newobject[]{});我最近以线程安全的方式使用它处理表单...varhandle=f.SynchronizedFunc(()=>f.Handle);我找到的最短解决方案显示在下面的按钮示例中,目标是更改按钮的文本。以上就是C#学习教程的全部内容:将线程安全访问方法写入WindowsForms控件的最短方法。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——if(buttonX.InvokeRequired)buttonX.Invoke((Action)(()=>buttonX.Text="Record"));elsebuttonX.Text="记录";本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理会员删除。如需转载请注明出处: