private void button1_Click(object sender, System.EventArgs e)
{
ThreadStart tsWorkTread1 = new ThreadStart( Display );
Thread tThread1  = new Thread( tsWorkTread1 );
tThread1.Name = "thread 1 :";
tThread1.IsBackground = true;
tThread1.Start();

ThreadStart tsWorkTread2 = new ThreadStart( Display );
Thread tThread2  = new Thread( tsWorkTread2 );
tThread2.Name = "thread 2 :";
tThread2.IsBackground = true;
tThread2.Start();
                  }
private void Display()
{
Thread tCurrentThread = Thread.CurrentThread;
for( int i = 0; i < 1000; i++ )
{
this.richTextBox1.Text += tCurrentThread.Name + i.ToString() + "\n";
}
} private System.Windows.Forms.RichTextBox richTextBox1;上述例子为什么会抛出NullReferenceException 呢?
有什么解决办法呢?
谢谢各位!

解决方案 »

  1.   

    简单的说,因为RichTextBox本身不是线程安全的,它的EditStreamProc函数可能会发生重入。具体信息看这里:
    http://laurel.datsi.fi.upm.es/metaplanet/sample2/?d=12&m=5&y=2005&calmonth=5&calyear=2005主题为Whidbey help for multithreading woes: CheckForIllegalCrossThreadCalls
    的讨论。
      

  2.   

    不要在别的线程上操作。Invoke一下
      

  3.   

    哦,对我看了一下帮助,说RichTextBox的实例成员不一定是线程安全的。
    用Invoke是什么意思呢?我现在想多个线程用同一个数据库连接来检索数据,可是我发现也是这么说的[但不保证任何实例成员是线程安全的],有什么好的办法呢?
      

  4.   

    使用lock来同步线程对共享数据的访问,也可以使用Monitor.以保证线程安全
      

  5.   

    使用多线程就是想通过一个数据库连接由多个线程来同时从数据库中取得数据,如果使用LOCK,那和使用单线程好像就没有什么分别了!在速度上好像不能得到提高!
    至于Monitor再看看,没仔细看过!
      

  6.   

    就我所知这应该不能实现,虽然我没有实现过数据库,不过我的感觉是数据库的每一个连接是开了一个线程来处理,数据库的一个线程如何处理你的多线程传过来的数据呢?还必须是一个事务!对于各个线程来说,它们之间互相是毫不了解的,要在同一个时间共享一个事务,我也不知道如何处理了。BTW:好像离你的问题越来越远了,我感兴趣的是多线程的话题,以下与数据库有关的问题,还是让别的高手来回答吧。不过建议你另开一贴了,不要让这个帖子在这里误导别人。
      

  7.   

    话题到此好像确实有点偏离!好的此帖到此吧!
    如果大家多我说的话题感兴趣,可看看我的另一贴:http://community.csdn.net/Expert/topic/4344/4344709.xml?temp=.4588739谢谢大家关注!