Сбой приложения C # внутри List.Enumerator - PullRequest
2 голосов
/ 17 августа 2011

У меня возникли проблемы с программным обеспечением, написанным моей компанией. Это сервер реального времени, работающий в качестве службы Windows, который использует RabbitMQ для взаимодействия с клиентом WebApplication / Silverlight. Неожиданно происходит сбой где-то между 10 минутами и 2 неделями после запуска службы. В программе просмотра событий приложения регистрируются 2 ошибки (я заменил имена классов и exe на XXX):

Источник: Ошибка приложения, Код события: 1000, Задача: (100)

Неисправное приложение XXX.exe, версия 0.0.1.18195, отметка времени 0x4e4a015e, неисправный модуль clr.dll, версия 4.0.30319.1, отметка времени 0x4ba21eeb, код исключения 0xc0000005, смещение ошибки 0x000000000018063e, идентификатор процесса 0x% 9, время запуска приложения 0x% 10.

и

Источник: .NET Runtime, Код события: 1023, Задача: Нет

Приложение: XXX.exe Framework Версия: v4.0.30319 Описание: процесс был остановлен из-за внутренней ошибки .NET Runtime в IP 000007FEF973063E (000007FEF95B0000) с кодом выхода 80131506.

И выдается следующее исключение. Кажется, что возникают проблемы с итерацией по основному массиву списка, как это может быть нулевым, вне меня.

XXX`1 [XXX]; Исключение: System.NullReferenceException: объект ссылка не установлена ​​на экземпляр объекта. в System.Collections.Generic.List`1.Enumerator.MoveNext () в System.Linq.Enumerable.WhereSelectListIterator`2.MoveNext () в System.Collections.Generic.List`1.InsertRange (индекс Int32, IEnumerable`1 коллекция)

Я попытался подключить ADPlus к сервису, но он замедляет его настолько, что его невозможно использовать. Поскольку доктора Ватсона больше нет в наличии, сложно получить дамп памяти, может ли кто-нибудь порекомендовать какие-либо другие инструменты, которые не слишком сильно повлияют на производительность?

Кто-нибудь видел что-нибудь подобное раньше?

1 Ответ

1 голос
/ 07 декабря 2011

Если исключение происходит в фоновом потоке в службе Windows, служба аварийно завершает работу.Похоже, что IEnumerable<T> передается в InsertRange это null.

Исправьте это, и проблема должна исчезнуть, однако вы все еще подвержены сбоям.Я бы порекомендовал всем вашим фоновым потокам перехватывать и обрабатывать исключения.Например, чтобы запустить безопасный поток пула потоков, вы можете сделать что-то вроде:

ThreadPool.QueueUserWorkItem(o =>
    {
        try
        {
            //...
        }
        catch (Exception e)
        {
            Log.Error(e);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...