从进程输出中异步捕获并在RichTextBox中显示

本文关键字:RichTextBox 显示 进程 输出 异步 | 更新日期: 2023-09-27 18:09:59

我有一个公共的和静态的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."

我试着用这个:

上下文。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次

从进程输出中异步捕获并在RichTextBox中显示

可以使用Control。invokerrequired和MethodInvoker的组合。在这里看到类似的帖子:http://social.msdn.microsoft.com/forums/en - us/csharpgeneral/thread/b9e6c83e e36b - 4 - f99 - 893 e - 0 - b242f4f225c