2011-11-06 88 views
2

执行InvokeRequired时出现stackverflow错误。检查InvokeRequired时发生Stackoverflow错误

System.StackOverflowException了未处理

enter image description here

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

修正版本:

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); 
     } 
    } 
+3

请注意,在这里发布代码而不是图片被认为是最佳做法。根据您已有的代码,以这种方式创建正确的代码示例会更容易。 – driis

回答

12

这是因为当InvokeRequired是真的,你一次次给完全相同的方法。您需要使用Invoke才能使方法计划在UI线程上运行。在这种情况下,InvokeRequired将为false,并且您的代码将运行到您实际显示该对话框的if分支。

更改代码沿着线的东西:

if(InvokeRequired) 
{ 
    Func<DialogResult> showMsg =() => ShowMessage(msg, caption, buttons); 
    return (DialogResult)Invoke(showMsg); 
} 
+1

您需要将委托类型更改为'Func '或类似的。 – Ani

+1

@Ani,好点,固定。 – driis

4

你得到一个计算器,因为ShowMessage方法是停留在一个不定式循环,因为它一遍又一遍,当“InvokeRequired”

自称