Parallel.Foreach中的Ninject异常

我有一段代码在要处理的项目列表上运行Parallel.Foreach 。 每次迭代都创建一对对象,每个对象都实例化并处理它自己的Ninject IKernel实例。 IKernel在对象完成工作时处理。

也就是说,这段代码在我的Windows 7,I7笔记本电脑上工作得非常好。 但是,当我将它推送到运行Windows 2008的VPS时,我得到这个异常。 异常不会在同一次迭代中发生,有时会经历10次迭代并抛出异常,有时会经历数百次异常。 显然,它似乎是一个线程问题,但它不会发生在我的VPS以外的任何地方。 如果它很重要,则将在ASP.NET IIS中进行托管。

System.AggregateException: One or more errors occurred. --->
System.ArgumentOutOfRangeException: Index was out of range. 
    Must be non-negative and less than the size of the collection.  
    Parameter name: index
        at System.Collections.Generic.List`1.RemoveAt(Int32 index)
        at Ninject.KernelBase.Dispose(Boolean disposing)

以下是代码片段:

//Code that creates and disposes the Ninject kernel
using(ninjectInstance = new NinjectInstance())
{
    using (var unitOfWork = ninjectInstance.Kernel.Get<NinjectUnitOfWork>())
    {
        Init();
        continueValidation = Validate(tran, ofr);
    }
}

public class NinjectInstance : IDisposable
{
    public IKernel Kernel { get; private set; }

    public NinjectInstance() 
    {           
        Kernel = new StandardKernel(
           new NinjectSettings() { AllowNullInjection = true }, 
           new NinjectUnitOfWorkConfigModule());          
    }

    public void Dispose()
    {
        if (Kernel != null)
        {
            Kernel.Dispose();
        }
    }
}   

编辑1有一件事是肯定的,这是一个线程安全问题,我不应该为每个应用程序创建多个IKernel实例。 对于如何配置合适的作用域来完成实体框架上下文线程安全性,仍然保留UoW类型的方法,其中多个业务层类可以在单个线程中在UoW范围内共享相同的EF上下文,这是一个理解问题。


请参阅http://groups.google.com/group/ninject/browse_thread/thread/574cd317d609e764

正如我告诉你Ninject的ctor不是线程安全的atm,除非你正在使用NOWEB ! 如果多次创建/部署内核,您将不得不自己同步访问权限! 我仍然建议重新设计你的UoW实现!


看起来ninjectInstance是一个实例变量。 因此,在并行环境中, ninjectInstance.Dispose()可能会被调用两次(调用Kernel.Dispose()不会将Kernel属性设置为null),因为Kernel.Dispose()已经被调用该方法失败。

也许你想要类似的东西

using (var ninjectInstance = new NinjectInstance()) {
..
}
链接地址: http://www.djcxy.com/p/52249.html

上一篇: Ninject exception in Parallel.Foreach

下一篇: How to pass an enum value to wcf webservice