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