为什么当我使用clear texbox并“同时”添加文本方法时,我的主表单会冻结吗? (多线程)

问题描述 投票:1回答:1

我的主窗体上有一个文本框,另一个类中运行的线程有时通过使用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");
}

感谢您的帮助并保持安全!

c# multithreading winforms textbox freeze
1个回答
0
投票

最后,我通过使用(具有相同的代码)使用RichTextBox而不是TextBox解决了我的问题。似乎TextBox不适合该串行接收任务

© www.soinside.com 2019 - 2024. All rights reserved.