在做WinFrom开发的时候,经常会遇到跨线程访问控件的问题,即从不是创建控件的线程去访问控件。百度里面搜索,会有各种各样的解决方案。在诸多方案中,我认为没有一个方案是特别简单,而且代码量少的。以前我也傻傻的创建委托(当然也尝试过其它方法),当数量多了以后,发现代码不整洁。今天,我就跟大家分享一下我的方法(至少我没发现别人用这种方法),不正之处,欢迎批评指正。
演示代码
/// <summary> /// 摘要: /// 修改Button控件文字(仅供演示) /// </summary> private void ChangeBtnText(string Text) { Action DoAction = delegate() { Btn.Text = Text; }; if (this.InvokeRequired) { ControlExtensions.UIThreadInvoke(this, delegate { DoAction(); }); } else { DoAction(); } }
辅助静态类代码
/// <summary> /// 摘要: /// 跨线程访问UI通用组件,在此类外的Try Catch语句不能捕获委托中的错误。 /// </summary> static class ControlExtensions { /// <summary> /// 同步执行 注:外层Try Catch语句不能捕获Code委托中的错误 /// </summary> static public void UIThreadInvoke(this Control control, Action Code) { try { if (control.InvokeRequired) { control.Invoke(Code); return; } Code.Invoke(); } catch { /*仅捕获、不处理!*/ } } /// <summary> /// 异步执行 注:外层Try Catch语句不能捕获Code委托中的错误 /// </summary> static public void UIThreadBeginInvoke(this Control control, Action Code) { if (control.InvokeRequired) { control.BeginInvoke(Code); return; } Code.Invoke(); } }
我认为这种写法是一劳永逸的,在解决问题的同时,代码量是最少的而且逻辑清楚代码整洁。关键是用这个方法去重构或者优化以前的代码是最省事的。你只需要将你以前的代码全部放到Action委托中,按这种模式套就可以了。
主要研发方向:Tcp,TcpNat,服务前端,反向连接,大规范并发
QQ交流群:697622527 欢迎交流
联系客服