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

作者:袖梨 2022-06-25

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 ){}
}

相关文章

精彩推荐