Как я могу отладить это StackOverflowException в моем приложении WinForm? - PullRequest
3 голосов
/ 29 августа 2011

У меня есть приложение winform.Каждые несколько секунд я проверяю некоторые файлы журнала, считываю новые данные и вставляю новые данные в БД.

Когда я запускаю приложение в течение часа 1/2, я получаю StackOverflowException.За весь этот период в файлах журналов не было новых данных, поэтому в БД не было добавлено ничего нового.

Код с ошибкой здесь ...

if (pictureBox == null)
{
    continue;
}

if (pictureBox.InvokeRequired)
{
    var toolTip = new ToolTip();
    GameServer tempGameFile = gameServer;
    pictureBox.Invoke(new MethodInvoker(
        () => toolTip.SetToolTip(pictureBox,
            string.Format(
                "{0} : Last Checked: {1}; Last Updated: {2}",
                tempGameFile.Name,
                tempGameFile.CheckedOn.ToLongTimeString(),
                tempGameFile.UpdatedOn.HasValue
                    ?
                        tempGameFile.UpdatedOn.Value.ToLongTimeString()
                        : "-No Date Set-"))));
}
pictureBox.Image = Resources.RedButton;

и pictureBox.Invoke(..)выдает эту ошибку.

Так что ... я не уверен, как я могу отрицать это, чтобы выяснить, что происходит?Есть какие-нибудь предложения?

ОБНОВЛЕНИЕ

Пытаясь предложить Дмитрий Я запустил профиль памяти профилировщика ANTS ... и быстро взглянул на вещи ...быть много экземпляров элементов управления ToolTip.

Это сводка списка классов через 20 минут.

enter image description here

Много EventHandlers (я что-то не выпускаю?)

И еще есть несколько всплывающих подсказок ...

Вот скриншот всех экземпляров и вот скриншот одногоПодсказка управления графиком / картой .. которую я не знаю, как читать blush

Ответы [ 2 ]

3 голосов
/ 29 августа 2011

У вас есть 2 потенциальные проблемы с вашим кодом:

var toolTip = new ToolTip();

и

pictureBox.Image = Resources.RedButton;

оба вызываются в потоке без пользовательского интерфейса. Я должен маршал этот код в поток пользовательского интерфейса, используя Control.Invoke . Если это не помогает, посмотрите на мой ответ о том, как отладить StackOverflowException в службе Windows .

ОБНОВЛЕНИЕ: попробуйте этот код. Обратите внимание, что каждый оператор, который ссылается на любой элемент управления пользовательского интерфейса, необходимо маршалировать с помощью Control.Invoke:

if (pictureBox == null || !pictureBox.IsHandleCreated) {
    continue;
}

Action setTooltipAndImage = () => {
    var toolTip = new ToolTip();
    GameServer tempGameFile = gameServer;
    toolTip.SetToolTip(pictureBox, string.Format(...));
    pictureBox.Image = Resources.RedButton;
};

if (pictureBox.InvokeRequired) {                        
    pictureBox.Invoke(setTooltipAndImage);
} else {
    setTooltipAndImage();
}

Возможно, стоит прочитать Управление элементами управления из потоков .

1 голос
/ 29 августа 2011

Если вы можете запустить свое приложение в режиме отладки, когда вы нажмете StackOverflowException и приложение перейдет в Visual Studio, откройте окно стека вызовов (Debug -> Windows -> Call Stack) и посмотрите, что вызывает Ваш код, чтобы бросить исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...