两个线程沟通

时间:2011-09-27 08:53:26

标签: c# multithreading exception

我有richTextBoxLog是公开的和静态的。

在我声明之后,我启动一个新线程,初始化名为proba的新变量。 richTextBoxLog应该从proba获得值。

问题是,proba需要时间进行初始化,我希望在richTextBoxLog初始化时初始化proba

我想写一些类似的东西:

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结束时继续运行。

编辑:我尝试使用它:

context.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();
    }

我现在遇到的问题是每次进入while循环时都要调用newMethod。但是,发生的事情是:while循环结束,之后newMethod被输入大约一千次。

2 个答案:

答案 0 :(得分:1)

您需要使用proba:

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

//编辑:

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

答案 1 :(得分:0)

我会考虑使用BackgroundWorker - 这样做会带来很多痛苦。

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

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