寻找建议我是否有一个真正的bug,如果它是,如何解决它最好的:Ninject中的错误?
我有一个高度多线程的过程,全天候运行。有几个对象是由Ninject在ThreadScope中提供的绑定注入的。
随着过程中的负载不断增加,过程开始越来越频繁地崩溃。在事件日志中的错误消息是这样的:
> 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源和谷歌搜索后,这似乎是有点问题的要么Ninject或.NET框架(取决于谁你听)。
看起来像修剪绑定缓存试图重新启动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文章,GC有可能在调用TimerCallback之前清理了定时器对象。因此,在“finally”子句中重新启动计时器会导致崩溃。
问题:我该如何解决这个Ninject代码?我应该忽略这种情况下的错误吗?我应该创建一个新的计时器吗?我应该做点别的吗?我目前修改了代码来忽略错误,这样我就可以简单地停止我的进程崩溃......但是担心它不是一个好的解决方案,任何建议都会被赞赏。
相关的主题文章: 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真棒工作)。链接中的代码是我一直在使用的代码,并且正在崩溃。计时器对象本身被放置在PruneCacheIfGarbageCollectoinHasRun()函数中。 'finally'子句试图调用'timer.Change'并且定时器已经被处置。 – Igorek 2012-02-16 17:30:25
该版本的Stop功能不同于2.2,应该解决问题。请参阅http://msdn.microsoft.com/en-us/library/b97tkt95.aspx但是,再次。主要的问题是你在应用程序执行期间处理内核,而不是在启动时创建一个内核,并在关闭时处理。 – 2012-02-16 21:34:53
我的应用程序在其大循环的每个循环中启动多个线程。每个线程正在处理从数据存储中检索的数据。在每个线程中,我将几个接口绑定到具体实现(每个实现都是线程特定的)。线程来来去去每个循环周期。 – Igorek 2012-02-16 21:56:40