令人驚訝的是,通過異步重複調用Window.ShowDialog可能導致堆棧溢出異常。C#WPF 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();
}
正如你可以看到有沒有實際的遞歸這裏(或不應該有過),但一旦發生異常時,你可以看到調用堆棧確實充分。 爲什麼? 這也不使用計時器來實現,如下所示:
private async void Button_Click(object sender, RoutedEventArgs e)
{
while (true)
{
this.Dispatcher.BeginInvoke(TheCallDelegate);
await Task.Delay(1);
}
}
P.S.你在這裏看到的代碼是專門爲了說明問題而構建的,所以不要關注爲什麼有人會這樣做。該問題的目的是瞭解ShowDialog爲什麼會以這種方式運行。
看着堆棧應該澄清問題......如果它沒有提供足夠的信息給你 - 發佈堆棧的小部分重複的問題。 –