Почему моя основная форма зависает, когда я использую методы очистки текста и добавляю текстовые методы «одновременно»? (Многопоточный) - PullRequest
1 голос
/ 23 марта 2020

У меня есть текстовое поле в моей основной форме и поток, работающий в другом классе, который иногда обновляет это же текстовое поле, добавляя некоторый текст, используя Texbox.AppendText("some text"). В моей основной форме у меня есть кнопка Очистить, которая очищает текстовое поле, когда пользователь нажимает эту кнопку, используя Texbox.Clear(). Но я замечаю, что иногда, когда пользователь нажимает эту кнопку очистки в то время, когда другой поток обновляет это же текстовое поле, мой IHM зависает на несколько секунд, и затем я могу использовать его снова. Я использовал потоковые методы вызова, как в MSDN do c, но я не могу понять, почему он не работает должным образом. Вот мой код:

// В моей основной форме 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");
}

Спасибо за помощь и будь в безопасности!

1 Ответ

0 голосов
/ 08 апреля 2020

Наконец я решил свою проблему, используя (с тем же кодом) RichTextBox вместо TextBox. Похоже, что TextBox не подходит для этой задачи последовательного приема

...