2012-02-16 69 views
1

寻找建议我是否有一个真正的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 Garbage Collection

回答

3

有一个在2.2时,导致高速缓存(Ninject)设置一个竞争条件的错误。这是固定在3.0

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

通常情况下,你不会看到任何问题,除非你正在创建和runtime-这在配置内核是不是仍要使用Ninject的好办法,应该避免每当可能。这样,发生此问题的唯一情况应该是关闭。

+0

雷莫,感谢您的回复(并在ninject真棒工作)。链接中的代码是我一直在使用的代码,并且正在崩溃。计时器对象本身被放置在PruneCacheIfGarbageCollectoinHasRun()函数中。 'finally'子句试图调用'timer.Change'并且定时器已经被处置。 – Igorek 2012-02-16 17:30:25

+0

该版本的Stop功能不同于2.2,应该解决问题。请参阅http://msdn.microsoft.com/en-us/library/b97tkt95.aspx但是,再次。主要的问题是你在应用程序执行期间处理内核,而不是在启动时创建一个内核,并在关闭时处理。 – 2012-02-16 21:34:53

+0

我的应用程序在其大循环的每个循环中启动多个线程。每个线程正在处理从数据存储中检索的数据。在每个线程中,我将几个接口绑定到具体实现(每个实现都是线程特定的)。线程来来去去每个循环周期。 – Igorek 2012-02-16 21:56:40