#c# #.net #multithreading #stack-overflow #invokerequired
#c# #.net #многопоточность #переполнение стека #invokerequired
Вопрос:
Я получаю ошибку stackverflow при выполнении InvokeRequired.
Система.Исключение StackOverflowException не было обработано
Как это исправить? Нет информации, которую я просматриваю подробно.
ИСПРАВЛЕННАЯ ВЕРСИЯ:
public DialogResult ShowMessage(string msg, string caption, MessageBoxButtons buttons)
{
if (InvokeRequired)
{
Func<DialogResult> m = () => MessageBox.Show(msg, caption, buttons);
return (DialogResult)Invoke(m);
}
else
{
return MessageBox.Show(msg, caption, buttons);
}
}
Комментарии:
1. Просто примечание, считается лучшей практикой размещать здесь код вместо изображения. Таким образом проще создать правильный пример кода на основе кода, который у вас уже есть.
Ответ №1:
Это потому, что, когда InvokeRequired
имеет значение true, вы вызываете один и тот же метод снова и снова. Вам нужно использовать Invoke
, чтобы получить метод, запланированный для запуска в потоке пользовательского интерфейса. В этом случае InvokeRequired
будет равно false, и ваш код будет запущен в if
ветку, где вы фактически показываете диалоговое окно.
Измените свой код на что-то вроде:
if(InvokeRequired)
{
Func<DialogResult> showMsg = () => ShowMessage(msg, caption, buttons);
return (DialogResult)Invoke(showMsg);
}
Комментарии:
1. Вам нужно изменить тип делегата на
Func<DialogResult>
или аналогичный.
Ответ №2:
Вы получаете stackoverflow, потому что метод ShowMessage застрял в бесконечном цикле, потому что он вызывает себя снова и снова, когда «InvokeRequired»