Ошибка Stackoverflow при проверке InvokeRequired

#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»