2012-02-16 1 views
1

내가 진짜 버그인지 여부에 대한 조언을 찾고 있다면, 그것을 가장 잘 고치는 방법 :Ninject의 버그?

나는 고도의 멀티 스레드 프로세스를 24 시간 내내 실행할 수 있습니다. Ninject에 의해 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에 또는 .NET 프레임 워크에 다소 문제의를 것으로 보인다 들리다).

바인딩 캐시의 정리 (Pruning)는 finally 절에서 폐기 타이머 개체를 다시 시작하려고합니다. 이 년 전에 그 논리에 문제를 해결하기 위해 시도했지만, 충분히 갈 표시되지 않습니다 http://groups.google.com/group/ninject/browse_frm/thread/cedf5d129120ee18/27119d7d3761eedd?tvc=1#27119d7d3761eedd

시스템 타이머가이 MSDN 문서에서 어떻게 작동하는지

마이크로 소프트는 설명 : http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx

MSDN 기사에 따르면 TimerCallback이 호출되기 전에 GC가 타이머 개체를 정리했을 수도 있습니다. 따라서 "finally"절에서 타이머를 다시 시작하면 충돌이 발생합니다.

질문 : Ninject 코드에서 어떻게 수정합니까? 이런 경우에 단순히 오류를 무시해야합니까? 새 타이머를 만들어야합니까? 다른 일을해야합니까? 현재 오류를 무시하도록 코드를 수정하여 프로세스가 중단되는 것을 막을 수는 있지만 훌륭한 솔루션이 아니라는 두려움 때문에 조언을 얻으실 수 있습니다.

관련 기사 : 캐시 (Ninject에)가 배치되는 경쟁 조건이 발생 2.2에서 문제가 http://groups.google.com/group/ninject/browse_thread/thread/8cdf8362a41153c7

.NET 3.5 C# Bug with System.Timer System.ObjectDisposedException: Cannot access a disposed object

Ninject Garbage Collection

답변

3

. 이 어쨌든해서 Ninject를 사용하는 좋은 방법이 아니다 때마다 피해야한다 당신이 작성하고이를 runtime- 동안 커널을 폐기하지 않는 한 어떤 문제가 표시되지해야 https://github.com/ninject/ninject/blob/fa46b56b683d5ddf570d00c1bd057ecfa0b3b487/src/Ninject/Activation/Caching/GarbageCollectionCachePruner.cs

일반적으로 참조 3.0

에서 해결 가능한. 그런 식으로이 문제가 발생하는 유일한 상황은 시스템 종료시에 있어야합니다.

+0

Remo, 답장을 보내 주셔서 감사합니다. 링크의 코드는 내가 사용해온 것이며 충돌합니다. 타이머 개체 자체는 PruneCacheIfGarbageCollectoinHasRun() 함수에 배치됩니다. 'finally'절은 'timer.Change'를 호출하려고 시도하고 있으며 타이머는 이미 삭제되었습니다. – Igorek

+0

이 버전의 Stop 기능은 2.2와 다르고 문제를 해결해야합니다. http://msdn.microsoft.com/en-us/library/b97tkt95.aspx를 참조하십시오. 주된 문제는 응용 프로그램을 시작할 때 커널을 만들고 종료 할 때 종료하는 대신 커널을 폐기하는 것입니다. –

+0

내 응용 프로그램이 큰 루프의 모든주기마다 여러 스레드를 시작하고 있습니다. 각 스레드는 데이터 저장소에서 검색하는 데이터를 처리합니다. 각 스레드 내에서 몇 가지 인터페이스를 구체적인 구현에 바인딩합니다 (각 구현은 스레드마다 다릅니다). 스레드는 모든 루프 사이클을 반복합니다. – Igorek