多线程UI更新应用程序中的StackOverflowException

时间:2017-07-25 11:40:02

标签: c# multithreading winforms

我有一个应用程序,其中一堆作业不起作用(等待Task.WhenAll ...)并更新表单的进度部分。

我注意到当它运行速度特别快时(例如,当没有太多处理要做,只需检查时),我就会得到以下异常:

StackOverflowException updating label text

InvokeRequired帮助方法是我之前在此网站上找到的方法,看起来像这样:

    internal static void InvokeIfRequired<T>(this T control, Action<T> action)
        where T : ISynchronizeInvoke
    {
        if (control.InvokeRequired)
        {
            control.Invoke(new Action(() => action(control)), null);
        }
        else
        {
            action(control);
        }
    }

有人能告诉我为什么像这样分配标签文本值会引起StackOverflowException吗?

编辑:以下是例外的详细信息

Thread error

1 个答案:

答案 0 :(得分:2)

可能有两种情况:

  • 您从工作流程中收到太多请求来更新信息并且它会破坏应用程序 - 在这种情况下,您需要执行一些称为“消除”的操作。 - 当您收到请求时,您不执行更新,但只将计时器设置为200毫秒并取消之前的计时器并且计时器执行更新,这样您就可以确保更新无法执行更新。在200毫秒内发生的频率超过一次,这不会打破应用程序。如果你经常在不到200ms的时间内获得新的请求很长时间,那么它可能会更加复杂,那么你需要实现逻辑以便有时更新而不是触发计时器。
  • 你有一些循环引用导致代码执行多次(但如果是这种情况你可能总是得到异常) - 你只能通过使用调试器并检查调用有问题代码的堆栈来检查这一点