У меня есть приложение 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 минут.
Множество обработчиков событий (я что-то не выпускаю?)
И еще есть несколько подсказок ...
Вот скриншот всех экземпляров и вот скриншот одного графика / карты элемента управления ToolTip .. который я не умею читать румянец
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();
}
Возможно, стоит прочитать Управление элементами управления из потоков а>.
Если вы можете запустить свое приложение в режиме отладки, когда вы нажмете StackOverflowException и приложение перейдет в визуальную студию, откройте окно стека вызовов (Отладка -> Windows -> Стек вызовов) и посмотрите, что заставляет ваш код работать выбросить исключение.
Похожие вопросы
Связанные вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.