两个线程通信

本文关键字:线程 通信 两个 | 更新日期: 2023-09-27 18:10:01

我有一个公共的和静态的richTextBoxLog

声明之后,我启动了一个新的线程,初始化名为proba的新变量。richTextBoxLogproba的值

问题是,proba需要时间来初始化,而我希望richTextBoxLogproba初始化时初始化。

我想这样写:

richTextBoxLogFile.richTextBoxLog.Text += proba;

但是,当我在前面提到的线程调用的方法中写入它时,我得到一个异常:"Cross-thread operation not valid: Control 'richTextBoxLog' accessed from a thread other than the thread it was created on."

我可以这样写:停止线程,然后初始化richTextBoxLog,然后再次启动线程,然后停止它,当初始化richTextBoxLog结束时,同样的继续。

编辑:我试着用这个:

上下文。Post(new SendOrPostCallback(newMethod), (object)proba);

context是主线程的上下文,newMethod初始化richTextBoxLog的值。然而,这个调用是在新线程启动的方法中,在while循环中:

   while (-1 != (ch = _reader.Read()))
        {
            Console.Write((char)ch);
            proba += ((char)ch).ToString();
            context.Post(new SendOrPostCallback(newMethod), (object)proba);                
        }
        _complete.Set();
    }

我现在的问题是,我希望newMethod在每次进入while循环时都被调用。但是,现在的情况是:while循环结束之后newMethod被输入了大约1000次

两个线程通信

您需要调用proba方法:

System.Windows.Threading.Dispatcher.CurrentDispatcher.Invoke(
     new Action(() => 
         {
               //do stuff with proba
         }
     ));

//编辑:

等等,这有点复杂。调度程序是一个对象,可以简单地说执行其他线程的方法。这意味着您需要使用proba在线程中创建一个调度程序,并在另一个线程中使用该调度程序来执行上述方法。

我会考虑使用BackgroundWorker -它可以减少像这样的操作的痛苦。

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

否则你需要使用Control。调用以再次同步线程- http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invoke.aspx(您不应该,而且通常不能,从UI线程以外的任何地方访问UI)