我的主窗体上有一个文本框,另一个类中运行的线程有时通过使用Texbox.AppendText("some text")
添加一些文本来更新同一文本框。在我的主窗体上,有一个“清除”按钮,当用户使用Texbox.Clear()
按下该按钮时,该按钮将清除texbox。但是我注意到有时,当用户在另一个线程更新同一文本框的同时按下此清除按钮时,我的IHM冻结了几秒钟,然后可以再次使用它。我使用了线程安全的调用方法,就像MSDN doc中所说的那样,但是我不知道为什么它不能正常工作。这是我的代码:
//以我的主窗体MainWindow
public static MainWindow GetInstance()
{
if (_IHM_Main == null)
{
_IHM_Main = new MainWindow();
}
return _IHM_Main;
}
public delegate void SafeCallDelegate(System.Windows.Forms.TextBox textBox, String texte);
public static void AppendText(System.Windows.Forms.TextBox textBox, String texte)
{
if (textBox.InvokeRequired)
{
var d = new SafeCallDelegate(AppendText);
textBox.Invoke(d, new object[] { texte });
textBox.AppendText(texte);
}
else
textBox.AppendText(texte);
}
private void btn_Clear_Click(object sender, EventArgs e)
{
if (textBox3.InvokeRequired)
{
MainWindow.GetInstance().BeginInvoke(new MethodInvoker(() => MainWindow.GetInstance().textBox3.Clear()));
}
else
textBox3.Clear();
}
//在运行线程的我的Class1.cs中
private delegate void ChangeTextBox(System.Windows.Forms.TextBox textbox, String texte);
private void UpdateTextboxRandomly()
{
MainWindow.GetInstance().Invoke(new ChangeTextBox(MainWindow.AppendText), MainWindow.GetInstance().textBox3, "adding some text");
}
感谢您的帮助并保持安全!
最后,我通过使用(具有相同的代码)使用RichTextBox
而不是TextBox
解决了我的问题。似乎TextBox
不适合该串行接收任务