C# WinForm 跨线程访问控件(实用简洁写法)

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 欢迎交流

 

 






 

 

 

 

 

 

转载于:https://www.cnblogs.com/zhangguihua/p/9989376.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值