我在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
我该如何解决这个问题?
答案 0 :(得分:1)
一种方法是异步调用委托,该委托在您调用它的表单中公开。例如:
mainForm.BeginInvoke(mainForm.logDelegate,destination,fileName,bytesSent, true);
答案 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
}