博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#线程中安全访问控件(重用委托,避免繁复的delegate,Invoke)总结
阅读量:2287 次
发布时间:2019-05-09

本文共 1856 字,大约阅读时间需要 6 分钟。

来自:http://www.cnblogs.com/slyzly/articles/2121436.html

1.第一种,不安全,当线程过多后,timer控件和线程中同时访问窗体控件时,有时会出现界面重绘出错。

public frmMain() {     InitializeComponent();     System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls =false; }

2.避免繁复的delegate,Invoke,推荐

public static class ControlCrossThreadCalls{    public delegate void InvokeHandler();    ///    /// 线程安全访问控件,扩展方法 .net 3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke    /// this.SafeInvoke(() =>    /// {    ///     tsStatus.Text = one.Email + " 开始任务....";    /// });    ///    //public static void SafeInvoke(this Control control, InvokeHandler handler)    //{    //    if (control.InvokeRequired)    //    {    //        control.Invoke(handler);    //    }    //    else    //    {    //        handler();    //    }    //}    ///    /// .net2.0线程安全访问扩展方法///    /// ControlCrossThreadCalls.SafeInvoke(this.tsStatus, new ControlCrossThreadCalls.InvokeHandler(delegate()    /// {    ///    tsStatus.Text = one.Email + " 开始任务...";    /// }));    public static void SafeInvoke(Control control, InvokeHandler handler)    {        if (control.InvokeRequired)        {            control.Invoke(handler);        }        else        {            handler();        }    }}

 

更正一个我发现的C#多线程安全访问控件普遍存在的问题,仅供参考,在网上搜索多线程访问控件,发现很多都是这种类似的写法

private void SetText(string text)    {        // InvokeRequired required compares the thread ID of the        // calling thread to the thread ID of the creating thread.        // If these threads are different, it returns true.        if (this.textBox1.InvokeRequired)        {            SetTextCallback d = new SetTextCallback(SetText);            this.Invoke(d, new object[] { text });        }        else        {            this.textBox1.Text = text;        }    }

注意红色部分,这样写几个线程同时操作时问题不是很大,但是当我几10个几100个线程频繁操作时,就出现了System.OutOfMemoryException这个异常,猜测可能是线程堵塞,同时造成cpu很高,内存成倍增长。

你可能感兴趣的文章
8086_proteus_masm配置
查看>>
8086_proteus_all_dsn
查看>>
Other_2015 规划
查看>>
Music_stories_index
查看>>
music_悲催的键盘手
查看>>
Others_各行业优秀的人
查看>>
欢迎使用CSDN-markdown编辑器
查看>>
DeepLearning 知识点整理
查看>>
stdcall 标准winNTdll 编写 与 调用
查看>>
Android 搭建
查看>>
Java 配置
查看>>
多个Activity的完全退出
查看>>
自定义android控件
查看>>
tomcat c/s 三层架构
查看>>
代码_多进程_简单实例
查看>>
转载_消息机制
查看>>
代码_网络_FTP
查看>>
代码_网络_WWW
查看>>
UIView常用属性和函数
查看>>
UIButton常用属性和函数详解
查看>>