3

执行 InvokeRequired 时出现 stackverflow 错误。

System.StackOverflowException 未处理

在此处输入图像描述

如何解决?没有信息我查看详细信息。

固定版本:

    public DialogResult ShowMessage(string msg, string caption, MessageBoxButtons buttons)
    {
        if (InvokeRequired)
        {
            Func<DialogResult> m = () => MessageBox.Show(msg, caption, buttons);
            return (DialogResult)Invoke(m);
        }
        else
        {
            return MessageBox.Show(msg, caption, buttons);
        }
    }
4

2 回答 2

13

这是因为当InvokeRequired为真时,您一次又一次地调用完全相同的方法。您需要使用Invoke该方法来安排在 UI 线程上运行的方法。在这种情况下,InvokeRequired将为 false,并且您的代码将运行到if您实际显示对话框的分支中。

将您的代码更改为以下内容:

if(InvokeRequired) 
{
    Func<DialogResult> showMsg = () => ShowMessage(msg, caption, buttons);
    return (DialogResult)Invoke(showMsg);
}
于 2011-11-06T12:16:11.657 回答
4

你得到一个堆栈溢出,因为 ShowMessage 方法卡在一个不定式循环中,因为它在“InvokeRequired”时一遍又一遍地调用自己

于 2011-11-06T12:16:37.530 回答