打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C#线程中安全访问控件(重用委托,避免繁复的delegate,Invoke)总结
InvokeRequired 属性 与Invoke方法(转)
Invoke and BeginInvoke
InvokeRequired and Invoke - jacky的日志 - 网易博客
WPF多线程访问控件
子线程访问住窗体控件
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服