У меня есть текстовое поле в моей основной форме и поток, работающий в другом классе, который иногда обновляет это же текстовое поле, добавляя некоторый текст, используя 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");
}
Спасибо за помощь и будь в безопасности!