Общей причиной 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 / finally не является строго необходимым, но целесообразно, если вы ожидаете, что ваша программа будет работать после исключения.