飘易博客(作者:Flymorn)
订阅《飘易博客》RSS,第一时间查看最新文章!
飘易首页 | 留言本 | 关于我 | 订阅Feed

c#多线程频繁操作同一控件“未将对象引用设置到对象的实例”

Author:飘易 Source:飘易
Categories:C#编程 PostTime:2012-11-24 19:55:52
正 文:
    c#软件设计中,如果有多个线程同时地频繁地操作UI主线程同一个控件时,比如显示状态等,往往会出现“未将对象引用设置到对象的实例”错误。

    有时即使你使用try...catch...来捕获错误依然无济于事,比如飘易最近的一个小开发应用。5个线程需要频繁的把状态写入到 RichTextBox 这个控件上,5个线程同时不停地写入数据,开始还好,但是运行一段时间后,就会出现“未将对象引用设置到对象的实例”错误,或者软件直接自动退出了。

    这样的异常客户一定不满意。我猜测问题还是出现在多线程身上,即使加上了以下这句:
Control.CheckForIllegalCrossThreadCalls = false; 
    以便允许线程的不安全调用,.net内部还是会出现错误。

    解决方法就是使用字符串 StringBuilder类(string也可以,但是效率不如StringBuilder),临时缓存要显示的数据,然后用一个定时器,定时写入到RichTextBox这个控件上,这样就避免了频繁的操作同一个控件

StringBuilder tmpv = new StringBuilder();
tmpv.AppendLine("...");

    定时器间隔可以设为5秒,每隔5秒把tmpv里的数据显示到RichTextBox即可。

private void timer1_Tick(object sender, EventArgs e)
        {//定时器
            try 
            {
                richTextBox1.AppendText(tmpv.ToString());
                tmpv.Length = 0; //清空StringBuilder 
            }
            catch (Exception ){}
        }

    如有疑问,欢迎您留言。
作者:飘易
来源:飘易
版权所有。转载时必须以链接形式注明作者和原始出处及本声明。
上一篇:解决Windows Server 2003 补丁(KB2686509)安装不了
下一篇:C#向RichTextBox写入数据并始终显示在最下方
2条评论 “c#多线程频繁操作同一控件“未将对象引用设置到对象的实例””
1 wllaoshu@qq.com
2012-11-25 17:40:45
线程 只是负责写到StringBuilder 里面吗?
2012-12-22 11:36:10
负责至少写到StringBuilder 里面吗
发表评论
名称(*必填)
邮件(选填)
网站(选填)

记住我,下次回复时不用重新输入个人信息
© 2007-2010 飘易博客 Www.Piaoyi.Org 原创文章版权由飘易所有 渝ICP备07006361号