跨线程时使用静态扩展方法更新控件

在CodeProject上看一个跨线程更新的方法,备忘一下。
如果在应用中存在较多简单的跨线程操作,下面的方法可能比较实用:

复制代码
复制代码
/// <summary>
        /// 
        /// </summary>
        private static object _object = new object();

        /// <summary>
        /// 
        /// </summary>
        private static T Instance;

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public static T GetInstance()
        {
            if (Instance == null)
            {
                lock (_object)
                {
                    if (Instance == null)
                    {
                        Instance = new T();
                    }
                }
            }
            return Instance;

        }
复制代码
复制代码

 

<br>public static class ExtensionMethod
{
    /// <summary>
    /// 有返回值的扩展方法
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <typeparam name="TResult"></typeparam>
    /// <param name="isi"></param>
    /// <param name="call"></param>
    /// <returns></returns>
    public static TResult SafeInvoke<T, TResult>(this T isi, Func<T, TResult> call) where T : ISynchronizeInvoke
    {
        if (isi.InvokeRequired) {
            IAsyncResult result = isi.BeginInvoke(call, new object[] { isi });
            object endResult = isi.EndInvoke(result); return (TResult)endResult;
        }
        else
            return call(isi);
    }
    /// <summary>
    /// 没有返回值的扩展方法
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="isi"></param>
    /// <param name="call"></param>
    public static void SafeInvoke<T>(this T isi, Action<T> call) where T : ISynchronizeInvoke
    {
        if (isi.InvokeRequired) isi.BeginInvoke(call, new object[] { isi });
        else
            call(isi);
    }
}
复制代码
复制代码
/// <summary>
        /// Generic Enum.Parse implementation.
        /// </summary>
        /// <typeparam name="TEnum">The enumeration type to parse to.</typeparam>
        /// <param name="strEnumValue">String value to parse.</param>
        /// <param name="defaultValue">Default value when conversion fails.</param>
        /// <returns>The parsed result or the default provided when parsing failed.</returns>
        public static TEnum ToEnum<TEnum>(this string strEnumValue, TEnum defaultValue)
        {
            if (!Enum.IsDefined(typeof(TEnum), strEnumValue))
                return defaultValue;

            return (TEnum)Enum.Parse(typeof(TEnum), strEnumValue);
        }


        /// <summary>
        /// Invoke passed in action synchronously on the GUI thread of this item. 
        /// </summary>
        /// <param name="me">The control.</param>
        /// <param name="action">Action that will be performed on the GUI thread.</param>
        public static void InvokeOnGui(this Control me, Action action)
        {
            if (me.InvokeRequired)
                me.Invoke(action);
            else
                action();
        }

        /// <summary>
        /// Invoke passed in action asynchronously on the GUI thread of this item.  Note: If this method is called
        /// on the GUI thread, the action will be performed synchronously. If it is called from another thread, it
        /// is invoked asynchronoulsly.
        /// </summary>
        /// <param name="me">The control.</param>
        /// <param name="action">Action that will be performed on the GUI thread.</param>
        public static void BeginInvokeOnGui(this Control me, Action action)
        {
            if (me.InvokeRequired)
                me.BeginInvoke(action);
            else
                action();
        }
复制代码
复制代码

然后在使用时就可以使用匿名委托很方便的操作:

1
2
3
lblProcent.SafeInvoke(d => d.Text = textForLabel);
progressBar1.SafeInvoke(d => d.Value = i);
string labelText = lblProcent.SafeInvoke(d => d.Text);

 

静态的扩展类方法使用泛型模板扩展像所有可继承 ISynchronizeInvoke 接口的控件,几乎适用于常见的所有控件呦 (来自 CodeProject 为所有类型的更新创建异步委托

 

出处:https://www.cnblogs.com/zhangchenliang/p/4938556.html

posted on   jack_Meng  阅读(393)  评论(1编辑  收藏  举报

编辑推荐:
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
阅读排行:
· DeepSeek V3 两周使用总结
· 回顾我的软件开发经历(1)
· C#使用yield关键字提升迭代性能与效率
· 低成本高可用方案!Linux系统下SQL Server数据库镜像配置全流程详解
· 4. 使用sql查询excel内容
历史上的今天:
2017-09-06 .NET平台上的Model-View-Presenter模式实践
2013-09-06 遍历json 对象的属性并且动态添加属性

导航

< 2025年1月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示

喜欢请打赏

扫描二维码打赏

支付宝打赏

主题色彩