Удивительно исключение переполнения стека может быть вызвано многократным вызовом 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 ведет себя таким образом.
Глядя на стек, следует прояснить проблему ... Если она не предоставит вам достаточной информации - отправьте небольшой повторный раздел стека на вопрос. –