De façon surprenante, une exception de dépassement de pile peut être provoquée en appelant de manière répétée Window.ShowDialog de manière asynchrone.C# WPF Exception de dépassement de pile Windows.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();
}
Comme vous pouvez le voir, il n'y a pas récursion réelle ici (ou il ne devrait pas avoir été) mais une fois que l'exception arrive, vous pouvez voir que la pile d'appel est en effet complet. Pourquoi? Cela peut également être obtenue sans l'utilisation d'une minuterie comme ceci:
private async void Button_Click(object sender, RoutedEventArgs e)
{
while (true)
{
this.Dispatcher.BeginInvoke(TheCallDelegate);
await Task.Delay(1);
}
}
post-scriptum Le code que vous voyez ici est construit spécifiquement pour illustrer la question, donc ne vous concentrez pas sur la raison pour laquelle quelqu'un le ferait. Le but de la question est de comprendre pourquoi ShowDialog se comporte de cette manière.
En regardant la pile devrait clarifier le problème ... Si elle ne fournit pas suffisamment d'informations à vous - poster une petite section répétée de la pile à la question. –