为什么IIS在PipelineRuntime.WaitForRequestsToDrain()的启动时卡住了?

时间:2014-06-20 12:11:04

标签: .net iis iis-7.5

当我从Visual Studio 2013启动.NET 4.5 Web应用程序时(但我不完全确定它仅限于此方案)IIS在启动应用程序时卡住了。如果我杀了w3wp.exe,它会自动重启并且应用程序正常工作。

当我将调试器附加到挂起的w3wp.exe时,我得到下面的堆栈跟踪。只有一个名为Worker thread的托管线程,其他所有托管线程都在运行本机代码 - 因此目前没有任何自定义代码正在运行/休眠 - 只有这一个。

mscorlib.dll!System.Threading.Thread.Sleep(int millisecondsTimeout)
System.Web.dll!System.Web.Hosting.PipelineRuntime.WaitForRequestsToDrain()
System.Web.dll!System.Web.HttpRuntime.Dispose()
System.Web.dll!System.Web.HttpRuntime.ReleaseResourcesAndUnloadAppDomain(object state)
mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx)
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx)
mscorlib.dll!System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
mscorlib.dll!System.Threading.ThreadPoolWorkQueue.Dispatch()
[Native to Managed Transition]  

这可能是什么原因?

1 个答案:

答案 0 :(得分:1)

我认为你值得回答。我遇到了同样的问题,看起来我已经解决了。

对我来说,这是因为我没有使用.ConfigureAwait(false)标记我的等待命令。我相信不使用它会导致主线程完成所有工作,通过切换代码段来保持忙碌。但是这个线程通过死锁被挂起(等待b,b等待c,c等待a)。

添加.ConfigAwait(false)会导致在单个上下文中没有上下文而不是线性处理的并行处理。

希望你能解决它。