分享

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

 行走在理想边缘 2020-06-29

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多