寻求关于我是否有真正的bug的建议,如果有,如何最好地修复它:
我有一个高度多线程的进程,运行24/7。有几个对象被注入了ThreadScope提供的绑定。
随着过程负荷的不断增加,过程开始崩溃的频率越来越高。事件日志中的错误消息如下:
框架版本: v4.0.30319描述:进程因未处理的异常而终止。异常信息:> **Ninject.Activation.Caching.GarbageCollectionCachePruner.PruneCacheIfGarbageCollectorHasRun(System.Object)**堆栈: at > System.NullReferenceException > 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和googling的源代码后,无论是Ninject还是.NET框架(取决于您所听的是谁),它似乎都是一个问题。
看起来,绑定缓存的剪枝正在尝试重新启动finally子句中已释放的计时器对象。一年前,有人试图用这个逻辑来解决一个问题,但似乎还远远不够:http://groups.google.com/group/ninject/browse_frm/thread/cedf5d129120ee18/27119d7d3761eedd?tvc=1#27119d7d3761eedd。
在本文中,微软解释了系统定时器是如何工作的:http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx。
根据MSDN文章,在调用TimerCallback之前,GC可能已经清理了timer对象。因此,在"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
发布于 2012-02-16 16:28:58
在2.2中有一个错误,在释放缓存时会导致一个争用条件。这是在3.0中修正的
通常,您不应该看到任何问题,除非您在运行时创建和处理内核-这不是一个好的方式使用尼尼微,并应尽可能避免。这样,出现这个问题的唯一情况应该是关机。
https://stackoverflow.com/questions/9314554
复制相似问题