2013-03-08 93 views
4

我是Autofac用户,现在面临很头痛的问题。我被电子邮件Alex和Travis问过这个问题,并得到了他们的回复,在这里,感谢他们的帮助。 为了彻底检查这个问题,我接受了Travis的建议,在这里发布了详细信息。Autofac造成的棘手的IIS死锁

我的邮箱:

我们使用Autofac 2.6.3.862在MVC3项目。

现在我们来到了IIS死锁问题是严重的,往往 挂,我们已经使用了微软的调试诊断工具对服务器做 分析(导致封闭分析报告),初步怀疑 是一个锁在LifetimeScope中

我已阅读文章,但对于某些技术细节模糊 me。我们的大部分注册的()成分是SingleInstance,所以当 解决()我不使用AA孩子一生的范围,想用(VAR范围 = Container.BeginLifetimeScope())

,不知道这是否是僵局的原因。

调试诊断分析报告

The following threads in 
w3wp.exe__hg__PID__3904__Date__03_07_2013__Time_11_01_07AM__974__Manual Dump.dmp are waiting to enter a .NET Lock which thread 39 is currently holding  
(26 34 42 43 44 45 46 47 48)  
16.67% of threads blocked  

====================================================================================== 

Detected possible blocking or leaked critical section at 0x0e758a00 owned by thread 26 in w3wp.exe__hg__PID__3904__Date__03_07_2013__Time_11_01_07AM__974__Manual Dump.dmp 

Impact of this lock  
1.85% of threads blocked 

(Threads 39) 

The following functions are trying to enter this critical section 

clr!UnsafeEEEnterCriticalSection+1c  

The following module(s) are involved with this critical section 

C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll 

====================================================================================== 

Thread 26 - System ID 7628 
Entry point 0x00000000 
Create time 2013/3/7 10:44:15 
Time spent in user mode 0 Days 00:00:00.218 
Time spent in kernel mode 0 Days 00:00:00.343 




This thread is waiting to enter a .NET Lock which thread 39 is currently holding 



.NET Call Stack 



Function 
System.Threading.Monitor.ReliableEnter(System.Object, Boolean ByRef) 
System.Threading.Monitor.Enter(System.Object, Boolean ByRef) 
Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(Autofac.Core.IComponentRegistration, System.Collections.Generic.IEnumerable`1) 
Autofac.Core.Container.ResolveComponent(Autofac.Core.IComponentRegistration, System.Collections.Generic.IEnumerable`1) 
Autofac.ResolutionExtensions.TryResolveService(Autofac.IComponentContext, Autofac.Core.Service, System.Collections.Generic.IEnumerable`1, System.Object ByRef) 
Autofac.ResolutionExtensions.ResolveService(Autofac.IComponentContext, Autofac.Core.Service, System.Collections.Generic.IEnumerable`1) 
Autofac.ResolutionExtensions.Resolve[[System.__Canon, mscorlib]](Autofac.IComponentContext, System.Collections.Generic.IEnumerable`1) 
Autofac.ResolutionExtensions.Resolve[[System.__Canon, mscorlib]](Autofac.IComponentContext) 
Tunynet.DIContainer.Resolve[[System.__Canon, mscorlib]]() 
Spacebuilder.Common.ProfileRepository..cctor() 
Spacebuilder.Common.ProfileRepository..ctor() 
Spacebuilder.Common.UserProfileService..ctor() 
Spacebuilder.Common.User.get_Profile() 
ASP._Page_Themes_Channel_Default_Views_FindUser__QuickSearch_cshtml.Execute() 
System.Web.WebPages.WebPageBase.ExecutePageHierarchy() 
System.Web.Mvc.WebViewPage.ExecutePageHierarchy() 
Tunynet.UI.ThemedWebViewPage.ExecutePageHierarchy() 
System.Web.WebPages.WebPageBase.ExecutePageHierarchy(System.Web.WebPages.WebPageContext, System.IO.TextWriter, System.Web.WebPages.WebPageRenderingBase) 
Tunynet.UI.ThemedRazorView.RenderView(System.Web.Mvc.ViewContext, System.IO.TextWriter, System.Object) 
System.Web.Mvc.BuildManagerCompiledView.Render(System.Web.Mvc.ViewContext, System.IO.TextWriter) 
System.Web.Mvc.ViewResultBase.ExecuteResult(System.Web.Mvc.ControllerContext) 
System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(System.Web.Mvc.ControllerContext, System.Web.Mvc.ActionResult) 
System.Web.Mvc.ControllerActionInvoker+<>c__DisplayClass1c.b__19() 
System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(System.Web.Mvc.IResultFilter, System.Web.Mvc.ResultExecutingContext, System.Func`1) 
System.Web.Mvc.ControllerActionInvoker+<>c__DisplayClass1c+<>c__DisplayClass1e.b__1b() 
System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(System.Web.Mvc.IResultFilter, System.Web.Mvc.ResultExecutingContext, System.Func`1) 
System.Web.Mvc.ControllerActionInvoker+<>c__DisplayClass1c+<>c__DisplayClass1e.b__1b() 
System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(System.Web.Mvc.IResultFilter, System.Web.Mvc.ResultExecutingContext, System.Func`1) 
System.Web.Mvc.ControllerActionInvoker+<>c__DisplayClass1c+<>c__DisplayClass1e.b__1b() 
System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(System.Web.Mvc.IResultFilter, System.Web.Mvc.ResultExecutingContext, System.Func`1) 
System.Web.Mvc.ControllerActionInvoker+<>c__DisplayClass1c+<>c__DisplayClass1e.b__1b() 
System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(System.Web.Mvc.ControllerContext, System.Collections.Generic.IList`1, System.Web.Mvc.ActionResult) 
System.Web.Mvc.ControllerActionInvoker.InvokeAction(System.Web.Mvc.ControllerContext, System.String) 
System.Web.Mvc.Controller.ExecuteCore() 
System.Web.Mvc.ControllerBase.Execute(System.Web.Routing.RequestContext) 
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(System.Web.Routing.RequestContext) 
System.Web.Mvc.MvcHandler+<>c__DisplayClass6+<>c__DisplayClassb.b__5() 
System.Web.Mvc.Async.AsyncResultWrapper+<>c__DisplayClass1.b__0() 
System.Web.Mvc.Async.AsyncResultWrapper+<>c__DisplayClass8`1[[System.Web.Mvc.Async.AsyncVoid, System.Web.Mvc]].b__7(System.IAsyncResult) 
System.Web.Mvc.Async.AsyncResultWrapper+WrappedAsyncResult`1[[System.Web.Mvc.Async.AsyncVoid, System.Web.Mvc]].End() 
System.Web.Mvc.MvcHandler+<>c__DisplayClasse.b__d() 
System.Web.Mvc.SecurityUtil.b__0(System.Action) 
System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(System.Action) 
System.Web.Mvc.MvcHandler.EndProcessRequest(System.IAsyncResult) 
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(System.IAsyncResult) 
System.Web.HttpApplication+CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
System.Web.HttpApplication.ExecuteStep(IExecutionStep, Boolean ByRef) 
System.Web.HttpApplication+PipelineStepManager.ResumeSteps(System.Exception) 
System.Web.HttpApplication.BeginProcessRequestNotification(System.Web.HttpContext, System.AsyncCallback) 
System.Web.HttpRuntime.ProcessRequestNotificationPrivate(System.Web.Hosting.IIS7WorkerRequest, System.Web.HttpContext) 
System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr, IntPtr, IntPtr, Int32) 
System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr, IntPtr, IntPtr, Int32) 
DomainNeutralILStubClass.IL_STUB_PInvoke(IntPtr, System.Web.RequestNotificationStatus ByRef) 
System.Web.Hosting.UnsafeIISMethods.MgdIndicateCompletion(IntPtr, System.Web.RequestNotificationStatus ByRef) 
System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr, IntPtr, IntPtr, Int32) 
System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr, IntPtr, IntPtr, Int32) 


Full Call Stack 



Function Source 
ntdll!KiFastSystemCallRet  
ntdll!NtWaitForMultipleObjects+c  
KERNELBASE!WaitForMultipleObjectsEx+100  
kernel32!WaitForMultipleObjectsExImplementation+e0  
clr!WaitForMultipleObjectsEx_SO_TOLERANT+56  
clr!Thread::DoAppropriateAptStateWait+4d  
clr!Thread::DoAppropriateWaitWorker+17d  
clr!Thread::DoAppropriateWait+60  
clr!CLREvent::WaitEx+106  
clr!CLREvent::Wait+19  
clr!AwareLock::EnterEpilogHelper+a8  
clr!AwareLock::EnterEpilog+42  
clr!AwareLock::Enter+5f  
clr!AwareLock::Contention+228  
clr!JITutil_MonReliableContention+e8  
System.Threading.Monitor.Enter(System.Object, Boolean ByRef)  
clr!CallDescrWorker+33  
clr!CallDescrWorkerWithHandler+8e  
clr!DispatchCallBody+20  
clr!DispatchCallDebuggerWrapper+75  
clr!DispatchCallNoEH+53  
clr!MethodTable::RunClassInitEx+f1  
clr!MethodTable::DoRunClassInitThrowing+53e  
clr!MethodDesc::DoPrestub+f1  
clr!PreStubWorker+12c  
0x00f80842  
clr!MethodTable::GetRestoredSlot+2a  
clr!MethodDesc::GetMethodEntryPoint+4e  
clr!MethodDesc::DoPrestub+51d  
clr!PreStubWorker+15d  
0x00f80842  
System.Web.WebPages.WebPageBase.ExecutePageHierarchy()  
System.Web.Mvc.WebViewPage.ExecutePageHierarchy()  
System.Collections.Generic.Stack`1[[System.__Canon, mscorlib]].Push(System.__Canon)  
System.Web.WebPages.WebPageBase.ExecutePageHierarchy(System.Web.WebPages.WebPageContext, System.IO.TextWriter, System.Web.WebPages.WebPageRenderingBase)  
System.RuntimeType+ActivatorCacheEntry..ctor(System.Type, System.RuntimeMethodHandleInternal, Boolean)  
System.Web.Mvc.BuildManagerCompiledView.Render(System.Web.Mvc.ViewContext, System.IO.TextWriter)  
System.Web.Mvc.ViewResultBase.ExecuteResult(System.Web.Mvc.ControllerContext)  
System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(System.Web.Mvc.ControllerContext, System.Web.Mvc.ActionResult)  
System.Web.Mvc.ControllerActionInvoker+<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19()  
System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(System.Web.Mvc.IResultFilter, System.Web.Mvc.ResultExecutingContext, System.Func`1<System.Web.Mvc.ResultExecutedContext>)  
System.Web.Mvc.ControllerActionInvoker+<>c__DisplayClass1c+<>c__DisplayClass1e.<InvokeActionResultWithFilters>b__1b()  
System.Web.Mvc.ControllerActionInvoker+<>c__DisplayClass1c+<>c__DisplayClass1e.<InvokeActionResultWithFilters>b__1b()  
System.Web.Mvc.ControllerActionInvoker+<>c__DisplayClass1c+<>c__DisplayClass1e.<InvokeActionResultWithFilters>b__1b()  
System.Web.Mvc.ControllerActionInvoker+<>c__DisplayClass1c+<>c__DisplayClass1e.<InvokeActionResultWithFilters>b__1b()  
System.Web.Mvc.ControllerActionInvoker.InvokeAction(System.Web.Mvc.ControllerContext, System.String)  
System.Web.Mvc.Controller.ExecuteCore()  
System.Web.Mvc.ControllerBase.Execute(System.Web.Routing.RequestContext)  
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(System.Web.Routing.RequestContext)  
System.Web.Mvc.MvcHandler+<>c__DisplayClass6+<>c__DisplayClassb.<BeginProcessRequest>b__5()  
System.Web.Mvc.Async.AsyncResultWrapper+<>c__DisplayClass1.<MakeVoidDelegate>b__0()  
System.Web.Mvc.MvcHandler+<>c__DisplayClasse.<EndProcessRequest>b__d()  
System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(System.Action)  
System.Web.Mvc.MvcHandler.EndProcessRequest(System.IAsyncResult)  
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(System.IAsyncResult)  
System.Web.HttpApplication+CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()  
System.Web.HttpApplication.ExecuteStep(IExecutionStep, Boolean ByRef)  
System.Web.HttpApplication+PipelineStepManager.ResumeSteps(System.Exception)  
System.Web.HttpApplication.BeginProcessRequestNotification(System.Web.HttpContext, System.AsyncCallback)  
System.Web.HttpRuntime.ProcessRequestNotificationPrivate(System.Web.Hosting.IIS7WorkerRequest, System.Web.HttpContext)  
System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr, IntPtr, IntPtr, Int32)  
System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr, IntPtr, IntPtr, Int32)  
webengine4!W3_MGD_HANDLER::ProcessNotification+5b  
webengine4!W3_MGD_HANDLER::DoWork+250  
webengine4!RequestDoWork+2da  
webengine4!CMgdEngHttpModule::OnExecuteRequestHandler+1a  
iiscore!NOTIFICATION_CONTEXT::RequestDoWork+128  
iiscore!NOTIFICATION_CONTEXT::CallModulesInternal+305  
iiscore!NOTIFICATION_CONTEXT::CallModules+28  
iiscore!W3_CONTEXT::DoStateRequestExecuteHandler+36  
iiscore!W3_CONTEXT::DoWork+d7  
iiscore!W3_MAIN_CONTEXT::ContinueNotificationLoop+1f  
iiscore!W3_MAIN_CONTEXT::ProcessIndicateCompletion+1f  
iiscore!W3_CONTEXT::IndicateCompletion+75  
webengine4!W3_MGD_HANDLER::IndicateCompletion+3d  
webengine4!MgdIndicateCompletion+24  
DomainNeutralILStubClass.IL_STUB_PInvoke(IntPtr, System.Web.RequestNotificationStatus ByRef)  
System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr, IntPtr, IntPtr, Int32)  
System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr, IntPtr, IntPtr, Int32)  
clr!UM2MThunk_WrapperHelper+10  
clr!UM2MThunk_Wrapper+8c  
clr!Thread::DoADCallBack+f0  
clr!UM2MDoADCallBack+c0  
0x00f98c20  
webengine4!W3_MGD_HANDLER::ProcessNotification+5b  
webengine4!ProcessNotificationCallback+36  
clr!UnManagedPerAppDomainTPCount::DispatchWorkItem+195  
clr!ThreadpoolMgr::NewWorkerThreadStart+20b  
clr!ThreadpoolMgr::WorkerThreadStart+3d1  
clr!Thread::intermediateThreadProc+4b  
kernel32!BaseThreadInitThunk+e  
ntdll!__RtlUserThreadStart+70  
ntdll!_RtlUserThreadStart+1b 


========================================================================= 

Thread 39 - System ID 4176 
Entry point 0x00000000 
Create time 2013/3/7 10:44:21 
Time spent in user mode 0 Days 00:00:00.140 
Time spent in kernel mode 0 Days 00:00:00.109 




This thread is not fully resolved and may or may not be a problem. Further analysis of these threads may be required. 



.NET Call Stack 



Function 
Spacebuilder.Common.ProfileRepository..ctor() 
Spacebuilder.Common.UserProfileService..ctor() 
Spacebuilder.Common.UserSearcher..ctor(System.String, System.String, Boolean, Int32) 
Spacebuilder.Environments.Starter.b__54(Autofac.IComponentContext) 
Autofac.RegistrationExtensions+<>c__DisplayClass10`1[[System.__Canon, mscorlib]].b__f(Autofac.IComponentContext, System.Collections.Generic.IEnumerable`1) 
Autofac.Builder.RegistrationBuilder+<>c__DisplayClass1`1[[System.__Canon, mscorlib]].b__0(Autofac.IComponentContext, System.Collections.Generic.IEnumerable`1) 
Autofac.Core.Activators.Delegate.DelegateActivator.ActivateInstance(Autofac.IComponentContext, System.Collections.Generic.IEnumerable`1) 
Autofac.Core.Resolving.InstanceLookup.Activate(System.Collections.Generic.IEnumerable`1) 
Autofac.Core.Resolving.InstanceLookup.b__0() 
Autofac.Core.Lifetime.LifetimeScope.GetOrCreateAndShare(System.Guid, System.Func`1) 
Autofac.Core.Resolving.InstanceLookup.Execute() 
Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(Autofac.Core.ISharingLifetimeScope, Autofac.Core.IComponentRegistration, System.Collections.Generic.IEnumerable`1) 
Autofac.Core.Resolving.InstanceLookup.ResolveComponent(Autofac.Core.IComponentRegistration, System.Collections.Generic.IEnumerable`1) 
Autofac.Features.Collections.CollectionRegistrationSource+<>c__DisplayClass4+<>c__DisplayClass6.b__1(Autofac.Core.IComponentRegistration) 
System.Linq.Enumerable+WhereSelectArrayIterator`2[[System.__Canon, mscorlib],[System.__Canon, mscorlib]].MoveNext() 
System.Linq.Buffer`1[[System.__Canon, mscorlib]]..ctor(System.Collections.Generic.IEnumerable`1) 
System.Linq.Enumerable.ToArray[[System.__Canon, mscorlib]](System.Collections.Generic.IEnumerable`1) 
Autofac.Features.Collections.CollectionRegistrationSource+<>c__DisplayClass4.b__0(Autofac.IComponentContext, System.Collections.Generic.IEnumerable`1) 
Autofac.Core.Activators.Delegate.DelegateActivator.ActivateInstance(Autofac.IComponentContext, System.Collections.Generic.IEnumerable`1) 
Autofac.Core.Resolving.InstanceLookup.Activate(System.Collections.Generic.IEnumerable`1) 
Autofac.Core.Resolving.InstanceLookup.Execute() 
Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(Autofac.Core.ISharingLifetimeScope, Autofac.Core.IComponentRegistration, System.Collections.Generic.IEnumerable`1) 
Autofac.Core.Resolving.ResolveOperation.Execute(Autofac.Core.IComponentRegistration, System.Collections.Generic.IEnumerable`1) 
Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(Autofac.Core.IComponentRegistration, System.Collections.Generic.IEnumerable`1) 
Autofac.Core.Container.ResolveComponent(Autofac.Core.IComponentRegistration, System.Collections.Generic.IEnumerable`1) 
Autofac.ResolutionExtensions.TryResolveService(Autofac.IComponentContext, Autofac.Core.Service, System.Collections.Generic.IEnumerable`1, System.Object ByRef) 
Autofac.ResolutionExtensions.ResolveService(Autofac.IComponentContext, Autofac.Core.Service, System.Collections.Generic.IEnumerable`1) 
Autofac.ResolutionExtensions.Resolve[[System.__Canon, mscorlib]](Autofac.IComponentContext, System.Collections.Generic.IEnumerable`1) 
Autofac.ResolutionExtensions.Resolve[[System.__Canon, mscorlib]](Autofac.IComponentContext) 
Tunynet.DIContainer.Resolve[[System.__Canon, mscorlib]]() 
Spacebuilder.Search.SearcherFactory.GetSearcher(System.String) 
Spacebuilder.Common.FindUserController._InterestedWithAll(Int32, Int32, System.String) 
DynamicClass.lambda_method(System.Runtime.CompilerServices.Closure, System.Web.Mvc.ControllerBase, System.Object[]) 
System.Web.Mvc.ActionMethodDispatcher.Execute(System.Web.Mvc.ControllerBase, System.Object[]) 
System.Web.Mvc.ReflectedActionDescriptor.Execute(System.Web.Mvc.ControllerContext, System.Collections.Generic.IDictionary`2) 
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(System.Web.Mvc.ControllerContext, System.Web.Mvc.ActionDescriptor, System.Collections.Generic.IDictionary`2) 
System.Web.Mvc.ControllerActionInvoker+<>c__DisplayClass15.b__12() 
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(System.Web.Mvc.IActionFilter, System.Web.Mvc.ActionExecutingContext, System.Func`1) 
System.Web.Mvc.ControllerActionInvoker+<>c__DisplayClass15+<>c__DisplayClass17.b__14() 
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(System.Web.Mvc.IActionFilter, System.Web.Mvc.ActionExecutingContext, System.Func`1) 
System.Web.Mvc.ControllerActionInvoker+<>c__DisplayClass15+<>c__DisplayClass17.b__14() 
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(System.Web.Mvc.IActionFilter, System.Web.Mvc.ActionExecutingContext, System.Func`1) 
System.Web.Mvc.ControllerActionInvoker+<>c__DisplayClass15+<>c__DisplayClass17.b__14() 
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(System.Web.Mvc.ControllerContext, System.Collections.Generic.IList`1, System.Web.Mvc.ActionDescriptor, System.Collections.Generic.IDictionary`2) 
System.Web.Mvc.ControllerActionInvoker.InvokeAction(System.Web.Mvc.ControllerContext, System.String) 
System.Web.Mvc.Controller.ExecuteCore() 
System.Web.Mvc.ControllerBase.Execute(System.Web.Routing.RequestContext) 
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(System.Web.Routing.RequestContext) 
System.Web.Mvc.MvcHandler+<>c__DisplayClass6+<>c__DisplayClassb.b__5() 
System.Web.Mvc.Async.AsyncResultWrapper+<>c__DisplayClass1.b__0() 
System.Web.Mvc.Async.AsyncResultWrapper+<>c__DisplayClass8`1[[System.Web.Mvc.Async.AsyncVoid, System.Web.Mvc]].b__7(System.IAsyncResult) 
System.Web.Mvc.Async.AsyncResultWrapper+WrappedAsyncResult`1[[System.Web.Mvc.Async.AsyncVoid, System.Web.Mvc]].End() 
System.Web.Mvc.MvcHandler+<>c__DisplayClasse.b__d() 
System.Web.Mvc.SecurityUtil.b__0(System.Action) 
System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(System.Action) 
System.Web.Mvc.MvcHandler.EndProcessRequest(System.IAsyncResult) 
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(System.IAsyncResult) 
System.Web.HttpApplication+CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
System.Web.HttpApplication.ExecuteStep(IExecutionStep, Boolean ByRef) 
System.Web.HttpApplication+PipelineStepManager.ResumeSteps(System.Exception) 
System.Web.HttpApplication.BeginProcessRequestNotification(System.Web.HttpContext, System.AsyncCallback) 
System.Web.HttpRuntime.ProcessRequestNotificationPrivate(System.Web.Hosting.IIS7WorkerRequest, System.Web.HttpContext) 
System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr, IntPtr, IntPtr, Int32) 
System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr, IntPtr, IntPtr, Int32) 
DomainNeutralILStubClass.IL_STUB_PInvoke(IntPtr, System.Web.RequestNotificationStatus ByRef) 
System.Web.Hosting.UnsafeIISMethods.MgdIndicateCompletion(IntPtr, System.Web.RequestNotificationStatus ByRef) 
System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr, IntPtr, IntPtr, Int32) 
System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr, IntPtr, IntPtr, Int32) 


Full Call Stack 



Function Source 
ntdll!KiFastSystemCallRet  
ntdll!NtWaitForSingleObject+c  
ntdll!RtlpWaitOnCriticalSection+13e  
ntdll!RtlEnterCriticalSection+150  
clr!UnsafeEEEnterCriticalSection+1c  
clr!CrstBase::Enter+1ad  
clr!ListLockEntry::FinishDeadlockAwareEnter+25  
clr!ListLockEntry::LockHolder::DeadlockAwareAcquire+28  
clr!MethodTable::DoRunClassInitThrowing+4c2  
clr!MethodDesc::DoPrestub+f1  
clr!PreStubWorker+12c  
0x00f80842  
clr!PreStubWorker+165  
System.Linq.Enumerable+WhereSelectArrayIterator`2[[System.__Canon, mscorlib],[System.__Canon, mscorlib]].MoveNext()  
System.Linq.Buffer`1[[System.__Canon, mscorlib]]..ctor(System.Collections.Generic.IEnumerable`1<System.__Canon>)  
System.Linq.Enumerable.ToArray[[System.__Canon, mscorlib]](System.Collections.Generic.IEnumerable`1<System.__Canon>)  
System.Collections.Generic.Stack`1[[System.__Canon, mscorlib]].Push(System.__Canon)  
clr!JIT_Stelem_Ref+25  
System.Collections.Generic.Stack`1[[System.__Canon, mscorlib]].Push(System.__Canon) 

亚历克斯回复:

这听起来像是一个棘手的一个。什么是DIContainer类做 ,你有任何注册为InstancePerHttpRequest, 或InstancePerLifetimeScope的组件吗?在背景中似乎也有一些石英作业 ,他们如何与容器进行交互?

特拉维斯回复:

非常快看看堆栈跟踪表明你可能有一些 长时间运行的操作或锁在 Spacebuilder.Environments.Starter, Spacebuilder发生。 Common.UserSearcher.ctor, Spacebuilder.UserProfileService.ctor或 Spacebuilder.Common.ProfileRepository。我所看到的是 有趣的是,在RESOLVE操作期间,无论组件 是否得到RESOLVED,都会有一个内部REGISTER进行。 没有看到代码,我不能告诉你那里发生了什么,但 那个线程 - #39 - 这是我看的东西。

它看起来像一个控制器操作被调用有一些 类型的lambda运行在关闭(DynamicClass.lambda_method) - 自定义管道中。 SearcherFactory.GetSearcher 手动尝试解决smoething。在 GetSearcher的解决方案中,有一些要求收集 - 例如IEnumerable服务。一个构造函数参数?这里就是它 会很奇怪:在解析该IEnumerable的,是越来越创建一个新的生命周期范围 和东西出现在 它被越来越注册?该LifetimeScope.ResolveComponent电话确实做了锁,使 确保决议是线程安全的。你得到一个僵局 ,这意味着两个不同的线程试图化解掉在同一时间同一 寿命范围(容器?),其中,在MVC,是 的东西,以避免 - 你可能不会碰到这种情况,例如, 如果你因为 只解决了HttpRequest的寿命范围的你只要上一个线程的时间。另外,您也可以 围绕路过寿命范围的应用做 服务定位的目的,并且,也可以是一个危险的信号。

有上并发维基页面也可以给你一些 指针:https://code.google.com/p/autofac/wiki/Concurrency

如果不能让你在你需要的方向发展,我建议 张贴到论坛讨论,因为,再,我真的不能够及时地提供个人帮助。这将得到其他的眼睛 它可能会帮助你更快。您需要包括: 对问题的描述(如本电子邮件中所述),但有更多关于您期望发生的事情的详细信息(例如,您正在访问控制器操作,并执行等等)。阻塞线程的堆栈跟踪。围绕那里的东西是被阻塞的代码: 您最初ContainerBuilder登记显示事情是如何 登记报名。那些构造函数和 挂起的东西是什么。该信息将帮助人们更快地找出 问题。这也是你应该尊重 的东西在看的东西被锁

我的质询细节:

服务器常常不规则悬挂,浏览器会突然停止响应UTIL我们使用iisreset命令重新启动服务器。我不确定是否有一个控制器被调用或者某些Quartz任务触发了这个时间。

在Application_Start()中,我们使用ContainerBuilder.Register()来注册同一根生命周期中的许多组件。而这些组件可能会互相呼叫。

他们大多注册为SingleInstance,如:

containerBuilder.Register(c => new DefaultCacheService(new MemcachedCache())).As<ICacheService>().SingleInstance(); 
containerBuilder.Register(c => new QuartzTaskScheduler()).As<ITaskScheduler>().SingleInstance(); 
containerBuilder.Register(c => new UserService()).As<IUserService>().SingleInstance(); 
containerBuilder.Register(c => new UserSearcher("~/App_Data/IndexFiles/User")).As<ISearcher>().SingleInstance(); 
containerBuilder.Register(c => new TagSearcher("~/App_Data/IndexFiles/Tag")).As<ISearcher>().SingleInstance(); 

只有注册为InstancePerHttpRequest,这些组件初始化与相关的每个请求数。如:

containerBuilder.Register(c => new FormsAuthenticationService()).As<IAuthenticationService>().InstancePerHttpRequest(); 

我们提供了一个类(DIContainer),它包含了一些用于组件解析的简单静态方法。何时解析组件,例如在某些Controller,Service,Repository(DAO)或Quartz任务中调用静态方法。

IContainer container = containerBuilder.Build(); 
DIContainer.RegisterContainer(container); 
DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 

public class DIContainer 
{ 
    private static IContainer _container; 

    public static void RegisterContainer(IContainer container) 
    { 
     _container = container; 
    } 

    public static TService Resolve<TService>() 
    { 
     return _container.Resolve<TService>(); 
    } 
    ...... 
} 

我们使用Lucene.Net的全文搜索服务,每个ISearcher对应一种类型的搜索和索引目录。 ISearcher在需要时在SearcherFactory.GetSearcher()中解析。

public static ISearcher GetSearcher(string IndexPath) 
{ 
    return DIContainer.Resolve<IEnumerable<ISearcher>>().Where(s => s.IndexPath.Equals(IndexPath, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault(); 
} 

这就是,但我仍然无法弄清楚根本原因。希望你的帮助。

+1

硬盘没有看到所有的代码和堆栈跟踪,但第一红旗说的是*“我们提供一个类(DIContainer)包括组件解决一些简单的静态方法。” * < - 你为什么不只是使用Autofac实现的构造函数注入?它会将依赖关系注入到Controllers,Services,...中,而不会诉诸像这样在容器周围传递“静态”代码。你为什么还要继续解决像这样的ISearcher实例?它们不是SearcherFactory生命周期中的一个固定集合,因此被注入到其构造函数中? – 2013-03-08 03:47:34

+0

鉴于线保持的锁处于'Spacebuilder.Common.ProfileRepository..ctor()','Spacebuilder.Common.UserProfileService..ctor()','Spacebuilder.Common.UserSearcher..ctor(System.String, System.String,Boolean,Int32)','Spacebuilder.Environments.Starter.b__54(Autofac.IComponentContext)'链,我们可能需要看到那个代码(正如我原来的回复中提到的那样)。 – 2013-03-08 15:47:47

回答

1

解决方法的内心工具是LifetimeScope.GetOrCreateAndShare,这种方法使用一个线程锁。检查ProfileRepository的静态构造函数,也许构造函数的线程锁和autofac的线程锁构成死锁。