C# WinForm 跨线程访问控件(实用简洁写法)
1.《C# WinForm 跨线程访问控件(实用简洁写法)》
2.《基于.NET环境,C#语言 实现 TCP NAT》
3.《基于Tcp穿越的Windows远程桌面(远程桌面管理工具)》
在做WinFrom开发的时候,经常会遇到跨线程访问控件的问题,即从不是创建控件的线程去访问控件。百度里面搜索,会有各种各样的解决方案。在诸多方案中,我认为没有一个方案是特别简单,而且代码量少的。以前我也傻傻的创建委托(当然也尝试过其它方法),当数量多了以后,发现代码不整洁。今天,我就跟大家分享一下我的方法(至少我没发现别人用这种方法),不正之处,欢迎批评指正。
演示代码
1 /// <summary> 2 /// 摘要: 3 /// 修改Button控件文字(仅测试) 4 /// </summary> 5 private void ChangeBtnText(string Text) 6 { 7 Action DoAction = delegate() 8 { 9 Btn.Text = Text; 10 }; 11 12 if (this.InvokeRequired) 13 { 14 ControlExtensions.UIThreadInvoke(this, delegate 15 { 16 DoAction(); 17 }); 18 } 19 else 20 { 21 DoAction(); 22 } 23 }
辅助类代码
1 static class ControlExtensions 2 { 3 /// <summary> 4 /// 同步执行 注:外层Try Catch语句不能捕获Code委托中的错误 5 /// </summary> 6 static public void UIThreadInvoke(this Control control, Action Code) 7 { 8 try 9 { 10 if (control.InvokeRequired) 11 { 12 control.Invoke(Code); 13 return; 14 } 15 Code.Invoke(); 16 } 17 catch 18 { 19 /*仅捕获、不处理!*/ 20 } 21 } 22 23 /// <summary> 24 /// 异步执行 注:外层Try Catch语句不能捕获Code委托中的错误 25 /// </summary> 26 static public void UIThreadBeginInvoke(this Control control, Action Code) 27 { 28 if (control.InvokeRequired) 29 { 30 control.BeginInvoke(Code); 31 return; 32 } 33 Code.Invoke(); 34 } 35 }
我认为这种写法是一劳永逸的,在解决问题的同时,代码量是最少的而且逻辑清楚代码整洁。关键是用这个方法去重构或者优化以前的代码是最省事的。你只需要将你以前的代码全部放到Action委托中,按这种模式套就可以了。
主要研发方向:Tcp,TcpNat,服务前端,反向连接,大规范并发
QQ交流群:697622527 欢迎交流