Нужен совет о том, есть ли у меня настоящая ошибка или нет, и как ее исправить:
У меня очень многопоточный процесс, который выполняется 24/7.Есть несколько объектов, которые внедряются с привязками, предоставленными в ThreadScope компанией Ninject.
Поскольку нагрузка на процесс постоянно увеличивалась, процесс начинал падать все чаще и чаще.Сообщение об ошибке в журнале событий было таким:
> Framework Version: v4.0.30319 Description: The process was terminated
> due to an unhandled exception. Exception Info:
> System.NullReferenceException Stack: at
> **Ninject.Activation.Caching.GarbageCollectionCachePruner.PruneCacheIfGarbageCollectorHasRun(System.Object)**
> at System.Threading.ExecutionContext.runTryCode(System.Object) at
> System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode,
> CleanupCode, System.Object) at
> System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext,
> System.Threading.ContextCallback, System.Object, Boolean) at
> System.Threading._TimerCallback.PerformTimerCallback(System.Object)
После загрузки исходного кода для Ninject и поиска в Google, это, похоже, является проблемой с Ninject или .NET framework (в зависимости от того, кого вы слушаете).
Похоже, что Обрезка связующего кэша пытается перезапустить удаленный объект таймера в предложении finally.Год назад была предпринята попытка исправить проблему с этой логикой, но, похоже, она зашла недостаточно далеко: http://groups.google.com/group/ninject/browse_frm/thread/cedf5d129120ee18/27119d7d3761eedd?tvc=1#27119d7d3761eedd
В этой статье MSDN Microsoft объясняет, как работает системный таймер: http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx
Согласно статье MSDN, возможно, что GC очистил объект таймера ДО вызова TimerCallback.Таким образом, перезапуск таймера в предложении "finally" вызывает сбой.
Вопрос: как исправить это в коде Ninject?Должен ли я просто игнорировать ошибку в таком случае?Должен ли я создать новый таймер?Должен ли я сделать что-то еще?В настоящее время я изменил код, чтобы игнорировать ошибку, чтобы я мог просто остановить мой процесс от сбоя ... но боюсь, что это не лучшее решение, любой совет приветствуется.
Статьи по теме: http://groups.google.com/group/ninject/browse_thread/thread/8cdf8362a41153c7
.NET 3.5 C # Ошибка с System.Timer System.ObjectDisposedException: Невозможно получить доступ к удаленному объекту
Ninject Сборка мусора