2011-11-30 44 views
0

什么是在WPF中window.ShowDialog()stackOverflowException的主要原因是什么?我收到10-20秒的时候我打电话后,此异常:window.ShowDialog的stackoverflowexception原因。 WPF

if(myWindow.ShowDialog() == true) 
{ 
    //other stuff 
} 

窗口中显示出来和作品不错,但后来我收到此异常。

+0

你在myWindow Shown事件中有一些代码吗? – Stecya

+0

你是否有一个事件处理程序中的这段代码被称为显示对话框的一部分? –

+0

按下按钮时调用此窗口。是的,我在这个窗口中有代码,但我没有找到递归或类似的东西。 –

回答

1

像这样的SOE的通用原因是有一个事件处理程序,其代码导致同一事件再次被引发。一个简单的例子是:

private void textBox1_TextChanged(object sender, TextChangedEventArgs e) { 
     textBox1.Text += "a"; 
    } 

键入一个字母,大约需要5秒钟的程序运行堆栈空间和炸弹。确切地诊断哪个事件处理程序导致此问题的主要武器是调试器,请查看Call Stack窗口。你可以通过使用一个小帮助变量来解决它,这个变量表示你期望事件再次被触发,这样你就可以忽略它。就像这样:

bool changingText; 

    private void textBox1_TextChanged(object sender, TextChangedEventArgs e) { 
     if (changingText) return; 
     changingText = true; 
     try { 
      textBox1.Text += "a"; 
     } 
     finally { 
      changingText = false; 
     } 
    } 

在try /如果你希望让你的程序运行异常后,终于不是绝对必要的,但明智的。

+0

我把这种代码从定时器: 'INT响应= MSR_Get_Write_Erase_Status();'' 如果(响应== 0)返回;'' else' ''{' //做something' '}' 这可能是例外的原因吗?我在'else'代码块末尾禁用了定时器 –

+0

不太可能猜到。按照我的建议使用调试器。 –

0

令人惊讶的是,堆栈溢出异常可能是由异步重复调用window.ShowDialog引起的。

public MainWindow() 
    { 
     InitializeComponent(); 
     TheCallDelegate = TheCall; 
     _timer = new DispatcherTimer(); 
     _timer.Tick += _timer_Tick; 
     _timer.Start(); 
    } 

    DispatcherTimer _timer = null; 

    void _timer_Tick(object sender, EventArgs e) 
    { 
     _timer.Dispatcher.BeginInvoke(TheCallDelegate);    
    } 

    Action TheCallDelegate; 

    void TheCall() 
    { 
     Window win = new Window(); 
     win.ShowDialog(); 
    } 

正如你可以看到有没有实际的递归这里(或不应该有过),但一旦发生异常时,你可以看到调用堆栈确实充分。 没有看看Window.ShowDialog是如何在内部实现的,我不能说这是什么原因。