내가 진짜 버그인지 여부에 대한 조언을 찾고 있다면, 그것을 가장 잘 고치는 방법 :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
Remo, 답장을 보내 주셔서 감사합니다. 링크의 코드는 내가 사용해온 것이며 충돌합니다. 타이머 개체 자체는 PruneCacheIfGarbageCollectoinHasRun() 함수에 배치됩니다. 'finally'절은 'timer.Change'를 호출하려고 시도하고 있으며 타이머는 이미 삭제되었습니다. – Igorek
이 버전의 Stop 기능은 2.2와 다르고 문제를 해결해야합니다. http://msdn.microsoft.com/en-us/library/b97tkt95.aspx를 참조하십시오. 주된 문제는 응용 프로그램을 시작할 때 커널을 만들고 종료 할 때 종료하는 대신 커널을 폐기하는 것입니다. –
내 응용 프로그램이 큰 루프의 모든주기마다 여러 스레드를 시작하고 있습니다. 각 스레드는 데이터 저장소에서 검색하는 데이터를 처리합니다. 각 스레드 내에서 몇 가지 인터페이스를 구체적인 구현에 바인딩합니다 (각 구현은 스레드마다 다릅니다). 스레드는 모든 루프 사이클을 반복합니다. – Igorek