Ошибка в Ninject? - PullRequest
       22

Ошибка в Ninject?

1 голос
/ 16 февраля 2012

Нужен совет о том, есть ли у меня настоящая ошибка или нет, и как ее исправить:

У меня очень многопоточный процесс, который выполняется 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 Сборка мусора

1 Ответ

3 голосов
/ 16 февраля 2012

В 2.2 есть ошибка, которая вызывает состояние гонки, когда кеш (Ninject) удаляется.Это исправлено в 3.0

См. https://github.com/ninject/ninject/blob/fa46b56b683d5ddf570d00c1bd057ecfa0b3b487/src/Ninject/Activation/Caching/GarbageCollectionCachePruner.cs

Обычно, вы не должны видеть никаких проблем, если вы не создаете и не удаляете ядра во время выполнения. Это не хороший способ использовать Ninject.в любом случае и следует избегать, когда это возможно.Таким образом, единственной ситуацией, в которой возникает эта проблема, должно быть отключение.

...