Ошибка переполнения стека при проверке InvokeRequired - PullRequest
3 голосов
/ 06 ноября 2011

Я получаю ошибку стека в процессе выполнения InvokeRequired.

Исключение System.StackOverflowException не обработано

enter image description here

Как это исправить?Информация отсутствует. Просмотреть подробности.

ИСПРАВЛЕННАЯ ВЕРСИЯ:

    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);
        }
    }

Ответы [ 2 ]

13 голосов
/ 06 ноября 2011

Это потому, что когда InvokeRequired истинно, вы вызываете один и тот же метод снова и снова. Вам нужно использовать Invoke, чтобы запланировать запуск метода в потоке пользовательского интерфейса. В этом случае InvokeRequired будет ложным, и ваш код попадет в ветку if, где вы фактически показываете диалог.

Измените свой код на что-то вроде:

if(InvokeRequired) 
{
    Func<DialogResult> showMsg = () => ShowMessage(msg, caption, buttons);
    return (DialogResult)Invoke(showMsg);
}
4 голосов
/ 06 ноября 2011

Вы получаете переполнение стека, потому что метод ShowMessage застрял в бесконечном цикле, потому что он вызывает себя снова и снова, когда "InvokeRequired"

...