在多线程Winforms应用程序中更新GUI的正确方法是什么?

时间:2015-06-23 04:58:05

标签: c# .net multithreading winforms user-interface

我有一个C#多线程应用程序,在不同的池中有一堆工作线程都调用此函数来更新WinForms应用程序中的文本框。

它有一个非常微妙的错误(或者如果你知道你在做什么,可能没有)会在很长一段时间内导致内存不足(我认为因为堆栈永远不会展开,但我和#39;我不确定。)

从我的应用中的任何线程更新文本框而不遇到此问题的正确方法是什么?根本问题是Application.DoEvents,但我不知道如何在没有它的情况下强制进行GUI更新(如果我把它取出,GUI永远不会更新)。

理想情况下,解决方案是一个函数,我可以从任何执行正确操作的线程调用。

private void WriteStatus(string s)
    {


        if (textBoxStatus.InvokeRequired)
        {
            textBoxStatus.Invoke(new Action<string>(WriteStatus), new object[] { s });
        }
        else
        {
            StringBuilder sb = new StringBuilder(s + Environment.NewLine);
            sb.Append(textBoxStatus.Text.Substring(0, textBoxStatus.Text.Length > 40000 ? 40000 : textBoxStatus.Text.Length));
            textBoxStatus.Text = sb.ToString();

            // don't call DoEvents more than once a second - this prevents stack over flow from frequent updates
            if (DateTime.Now - lastGUIUpdate > TimeSpan.FromSeconds(1))
            {
                Application.DoEvents();
                lastGUIUpdate = DateTime.Now;
            }
        }

    }

我已经针对此问题查看了其他SO解决方案,但他们似乎忽略了Application.DoEvents步骤。在这种情况下,他们如何强制GUI更新?在我的应用程序评论这一行修复我的内存问题,但我的文本框永远不会更新。

0 个答案:

没有答案