如何从另一个Form的Thread中将文本粘贴到Form的RichTextBox?

时间:2011-11-27 15:05:23

标签: c# multithreading

我在C#中有一个Windows窗体应用程序。我在主窗口(MainForm)中有一个RichTextBox(Txt)和一个公共方法

public void postTxt(String txt)
{
    //do some database update
    this.Txt.AppendText(txt);
}

我有另一个名为SerialTranseiver(MainForm mn)的表单,它将MainForm作为参数传递给构造函数。

SerialTranseiver(MainForm mn)
{
    //-----other codes
    this.tmpMain=mn;
}

这第二个类有一个SerialPort(Sport)并等待数据以及每次在其中找到数据 SerialDataReceivedEventHandler调用mn.postTxt(Sport.ReadLine()。toString())

void Sport_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    mn.postTxt(Sport.ReadLine().toString());
    //---database updating codes and other stuff
 }

这导致了一个说

的异常
Cross-thread operation not valid: Control 'Txt' accessed from a thread other than the thread it was created on

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

一种方法是异步调用委托,该委托在您调用它的表单中公开。例如:

 mainForm.BeginInvoke(mainForm.logDelegate,destination,fileName,bytesSent, true);

我建议您先阅读this,然后再阅读this

答案 1 :(得分:0)

要解决您的问题,请阅读以下帖子:

对于您的情况,请尝试:

void Sport_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    if (this.InvokeRequired) 
    {
        this.Invoke(new MethodInvoker(() => Sport_DataReceived(sender, e)));
        return;
    }

    mn.postTxt(Sport.ReadLine().toString());
    //---database updating codes and other stuff
}