Windows 7,SignalR2。
我有一些HelloWorld SignalR代码可以在一个VS2013项目中运行(即我的SignalR hello world playground)。
当我将相同的代码添加到现有应用程序时,SignalR线程"挂起"在IIS"永远"。这种情况每次都会发生。
我的SignalR控制台如下:
我的perfMon计数器看起来像这样:
我的工作进程列表如下所示:
关于从哪里开始调试的一些提示后我来了。在Java中,我会采用线程转储,我可以很容易地看到发生了什么。
当作为调试器连接时,这些线程在VS2013中不可见。
IIS / DotNet中似乎没有等效的内容?
这是我的中心:
public class Ep1DataImportHub : Hub
{
public int recordsToBeProcessed = 100000;
public void DoLongOperation()
{
for (int record = 0; record <= recordsToBeProcessed; record++)
{
if (ShouldNotifyClient(record))
{
Clients.Caller.sendMessage(string.Format
("Processing item {0} of {1}", record, recordsToBeProcessed));
Thread.Sleep(10);
}
}
}
private static bool ShouldNotifyClient(int record)
{
return record % 10 == 0;
}
}
这是我的客户端,被截断为最简单的悬挂方案。
$(function () {
// Initialize the connection to the server
var realtimeNotifier = $.connection.ep1DataImportHub;
$.connection.hub.logging = true;
$.connection.hub.start();
})
有很多关于带有SignalR 1的IIS中的SignalR挂起,但我使用的是SignalR 2.
有人可以告诉我如何开始调试正在进行的操作。这个工具看起来很有趣,但我不知道它是什么https://github.com/SignalR/SignalR/issues/1335(https://github.com/SignalR/SignalR/issues/1335)
以下是其中一个卡住线程的托管调用堆栈
System_Web_ni!DomainNeutralILStubClass.IL_STUB_PInvoke(IntPtr, Boolean, Boolean ByRef)+8f
[[InlinedCallFrame] (System.Web.Hosting.UnsafeIISMethods.MgdExplicitFlush)] System.Web.Hosting.UnsafeIISMethods.MgdExplicitFlush(IntPtr, Boolean, BooleanByRef)
System_Web_ni!System.Web.Hosting.IIS7WorkerRequest.ExplicitFlush()+20
System_Web_ni!System.Web.HttpResponse.Flush(Boolean, Boolean)+c3
System_Web_ni!System.Web.HttpWriter.WriteFromStream(Byte[], Int32, Int32)+a0
Microsoft.Owin.Host.SystemWeb.CallStreams.DelegatingStream.Write(Byte[], Int32, Int32)+3a
Microsoft.Owin.Host.SystemWeb.CallStreams.OutputStream.Write(Byte[], Int32, Int32)+3b
Microsoft.AspNet.SignalR.Owin.ServerResponse.Write(System.ArraySegment`1)+24
Microsoft.AspNet.SignalR.Hosting.ResponseExtensions.End(Microsoft.AspNet.SignalR.Hosting.IResponse, System.String)+c8
Microsoft.AspNet.SignalR.PersistentConnection+d__f.MoveNext()+180
mscorlib_ni!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)+285
mscorlib_ni!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)+9
mscorlib_ni!System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner.Run()+a4
System_Web_ni!System.Web.Util.SynchronizationHelper.SafeWrapCallback(System.Action)+b4
mscorlib_ni!System.Threading.Tasks.Task.Execute()+6e
mscorlib_ni!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)+285
mscorlib_ni!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)+9
mscorlib_ni!System.Threading.Tasks.Task.ExecuteWithThreadLocal(System.Threading.Tasks.Task ByRef)+250
mscorlib_ni!System.Threading.Tasks.Task.ExecuteEntry(Boolean)+85
mscorlib_ni!System.Threading.ThreadPoolWorkQueue.Dispatch()+1ea
[[DebuggerU2MCatchHandlerFrame]]
[[ContextTransitionFrame]]
[[DebuggerU2MCatchHandlerFrame]]
答案 0 :(得分:4)
您是否碰巧定义了Application_PreSendRequestHeaders
方法,或者您是否以其他方式附加到HttpApplication.PreSendRequestHeaders
事件?
我问,因为这似乎与报告here的问题相同。对于该线程中的至少一些人,删除PreSendRequestHeaders事件处理程序解决了该问题。
虽然我们recommend you never use the PreSendRequestHeaders event,但我们积极working on this issue,因此我们可以为2.1.1修复此问题。
如果您没有附加PreSendRequestHeaders事件,我们(SignalR团队)可以使用您的帮助。到目前为止,我们无法在不附加PreSendRequestHeaders事件的情况下重现此问题。如果您可以向我们提供不附加到此活动的应用程序,但仍然以这种方式挂起,我们将非常感激。
SignalR(2.0.3)的早期版本没有向/ signalr / start发出请求,也没有遇到此挂起。因此,您可以暂时解决此问题,方法是将SignalR 2.1.0降级到2.0.3,直到2.1.1发布。
答案 1 :(得分:1)
我们将此问题追溯到Glimpse.ASPNet。它将自己附加到PreSendRequestHeaders。因此,如果您将Glimpse.ASPNet与SignalR一起使用,您可能会发现线程会“永远”锁定。
删除Glimpse.AspNet修复了问题