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

Когда я запускаю приложение около полутора часов, я получаю 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

Множество обработчиков событий (я что-то не выпускаю?)

И еще есть несколько подсказок ...

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

3
Pure.Krome 29 Авг 2011 в 08:06

2 ответа

Лучший ответ

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

var toolTip = new ToolTip();

А также

pictureBox.Image = Resources.RedButton;

Оба вызываются в потоке, отличном от UI. Мне нужно маршалировать этот код в поток пользовательского интерфейса, используя 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();
}

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

3
Community 23 Май 2017 в 10:30

Если вы можете запустить свое приложение в режиме отладки, когда вы нажмете StackOverflowException и приложение перейдет в визуальную студию, откройте окно стека вызовов (Отладка -> Windows -> Стек вызовов) и посмотрите, что заставляет ваш код работать выбросить исключение.

1
Kiley Naro 29 Авг 2011 в 04:16