Microsoft Unity HierarchicalLifetimeManager死锁

时间:2018-07-11 20:37:29

标签: c# unity-container

我有一个使用OWIN和Unity 5.5.0的自托管异步c#webapi。

我在一些压力测试过程中遇到了一个问题,在几个小时后,webapi将停止处理请求,而客户端调用将超时。

我在挂起模式下使用adplus生成了一个故障转储,在Visual Studio中打开了转储,发现我的应用程序被锁定在统一方法SynchronizedLifetimeManager.GetValue()

Threads Blocked by SynchronizedLifetimeManager.GetValue

该方法的代码应为

    /// <summary>
    /// Retrieve a value from the backing store associated with this Lifetime policy.
    /// </summary>
    /// <returns>the object desired, or null if no such object is currently stored.</returns>
    /// <remarks>Calls to this method acquire a lock which is released only if a non-null value
    /// has been set for the lifetime manager.</remarks>
    public override object GetValue()
    {
        Monitor.Enter(lockObj);
        object result = SynchronizedGetValue();
        if (result != null)
        {
            Monitor.Exit(lockObj);
        }
        return result;
    }

我对方法的理解是请求检索对象,如果未设置对象,则返回但保留锁。当对象被设置为锁定时,监视器将退出,线程应该能够调用。

我的可见问题是,在某些时候unity并没有该生存期管理器的值并阻塞了线程,但是没有调用set来释放它们。

选项1:在某些时候,生命周期管理器中的值已更改为null。什么会导致这种情况发生? 选项2:用于解除锁定的SetValue调用失败或根本没有进行。是什么导致值被设置?

我的假设是,我的代码中某个地方的异常未得到正确处理,并导致了此问题,但是我不确定从哪里开始寻找,并希望更好地了解统一的意图。

应用程序具有一个类,其中我们将接口注册为IOC的类型。这用于大多数映射。但是,这是一个工作流应用程序,因此在所有调用中的某一时刻,我们查找要调用的工作流类,并告诉unity解析类型字符串并注入所需的任何对象。

0 个答案:

没有答案