我是Autofac用户,现在面临一个非常头痛的问题。我被电子邮件Alex和Travis问到了这个问题,得到了他们的答复,在此,感谢他们的帮助。 为了彻底检查这个问题,我接受了Travis的建议,在这里发布了详细信息。
我的电子邮件:
我们在mvc3项目中使用Autofac 2.6.3.862。
现在我们来到IIS死锁问题严重,服务器经常 挂起,我们使用Microsoft Debug Diagnostics Tool来做 最初怀疑是分析(导致附上分析报告) 成为LifetimeScope的锁定我已阅读过您的文章,但有些技术细节含糊不清 我。我们的大多数Register()组件都是SingleInstance,所以当 Resolve()我没有像使用(var scope)那样使用子生命周期范围 = 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)
Alex回复:
这听起来像是一个棘手的问题。什么是DIContainer课程 你有任何组件注册为InstancePerHttpRequest, 还是InstancePerLifetimeScope?似乎还有一些Quartz工作 在后台,他们如何与容器互动?
特拉维斯回复:
快速查看堆栈跟踪表明您可能有一些 长时间运行的操作或锁定发生在 Spacebuilder.Environments.Starter, Spacebuilder.Common.UserSearcher.ctor, Spacebuilder.UserProfileService.ctor,或 Spacebuilder.Common.ProfileRepository。我看到了什么 有趣的是,在RESOLVE操作期间,无论什么时候 组件被解析,内部REGISTER正在进行中。 没有看到代码,我无法告诉你那里发生了什么,但是 那个帖子 - #39 - 这就是我所看到的东西。
看起来......正在调用一个控制器动作还有一些 运行在闭包上的lambda(DynamicClass.lambda_method) - 在你的管道中定制的东西。 SearcherFactory.GetSearcher 手动尝试解决smoething。在决议期间 GetSearcher,有些东西要求收集 - 就像一个 IEnumerable服务。构造函数参数?这就是它的所在 变得怪异:在解析IEnumerable时,一个新的生命周期范围 正在创建,似乎有些东西正在注册 它? LifetimeScope.ResolveComponent调用确实执行锁定 确定的解决方案是线程安全的。你正陷入僵局的事实 意味着两个不同的线程试图解决相同的问题 生命期范围(容器?)同时,在MVC中,是 要避免的事情 - 你可能不会遇到这种情况,例如, 如果你只是从HttpRequest生命周期范围解析,那么 你一次只能在一个线程上拥有它。或者,你可以 为了做到这一点,在应用程序中传递生命周期范围 服务地点,也可能是一面红旗。
Concurrency上有一个wiki页面,也可以给你一些 指针:https://code.google.com/p/autofac/wiki/Concurrency
如果那不能让你朝着你需要的方向前进,我建议你 发布到讨论论坛,再次,我真的不能 及时提供个人帮助。那将会得到 其他的眼睛,可能会尽快给你帮助。您想要包括: 问题的描述(就像在这封电子邮件中一样)但有更多 关于你期望发生什么的详细信息(例如,你正在访问一个 控制器动作,等等等等等等。堆栈的痕迹 阻止线程。事情被阻止的代码: 您的初始ContainerBuilder注册以显示事物的方式 注册。那些构造函数和事物中的内容是什么 挂了该信息将帮助人们更快地根除 问题。这也是你应该尊重的东西 被锁定的事情
我的补充问题详情:
服务器经常不规则挂起,浏览器会突然停止响应我们使用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对应一种搜索和索引目录。在需要时,可以在SearcherFactory.GetSearcher()中解析ISearcher。
public static ISearcher GetSearcher(string IndexPath)
{
return DIContainer.Resolve<IEnumerable<ISearcher>>().Where(s => s.IndexPath.Equals(IndexPath, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault();
}
就是这样,但我仍然无法弄清楚根本原因。希望得到你的帮助。
答案 0 :(得分:1)
Resolve Method的内部工具是LifetimeScope.GetOrCreateAndShare,此方法使用线程锁。检查ProfileRepository的静态构造函数,也许构造函数的线程锁和autofac的线程锁构成死锁。