我有一个使用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解析类型字符串并注入所需的任何对象。