SignalR集线器调用死锁
我有一些hubProxy.Invoke("Method", param)
异步执行的方法。他们都调用相同的方法,但具有不同的参数。问题在于它们都在一些PC上正确执行,但另一个面临的问题是只有第一个方法调用被执行,而其他方法将永远执行。 方法看起来像SignalR集线器调用死锁
if (!connectingTask.IsCompleted)
{
logger.Debug("awaiting for SignalR connection");
await connectingtTask;
logger.Debug("SignalR connected");
}
await hubProxy.Invoke("MethodName", args);
logger.Debug("MethodName invoked");
凡connectingTask = Connection.Start();
和Connection
是HubConnection实例。
当所有的方法(2,例如)执行输出看起来像
Method 1: awaiting for SignalR connection
Method 2: awaiting for SignalR connection
Method 1: SignalR connected
Method 1: MethodName invoked
Method 2: SignalR connected
Method 2: MethodName invoked
而当只执行第一种方法输出看起来像
Method 1: awaiting for SignalR connection
Method 2: awaiting for SignalR connection
Method 1: SignalR connected
Method 2: SignalR connected
Method 1: MethodName invoked
而Method 2
被死锁。 Connection.StateChanged
回调中没有方块,Invoke()
方法后没有方块。 那么我在做什么错误,以及如何正确调用与不同的args相同的方法?我应该有一些队列还是什么?
编辑还是可以因为我在await connectionTask
之后发送Invoke
?现在无法检查,因为在我的电脑上一切正常。链接:
https://forums.asp.net/t/2024936.aspx?C+Client+Hangs+Deadlocks+Never+Returns
编辑如果涉及我的枢纽的方法。我祈求有Task
返回类型。
编辑 这里是我的枢纽方法:
public Task Attach(string groupName)
{
return Groups.Add(Context.ConnectionId, groupName);
}
我无法打开跟踪,因为在我的电脑通常都是正确的,但一旦我能够重现同样的问题。不记得如何,我会尽量找到后来,但问题是,我没有收到答案时调用集线器附加方法,只是简单地将用户添加到组。所以现在,而不是await hubProxy.Invoke("Attach", groupName)
我使用hubProxy.Invoke("Attach", groupName)
。无法理解为什么我的第一个调用总是成功,我在跟踪中看到了一些答案,但之后,同一方法的所有调用都失败。但是如果我等待一段时间(大约10+秒)并调用这个方法,我又会得到回应。所以看起来我只能每10秒调用一次集线器方法一次。
我会尝试再次重新创建此问题并添加完整跟踪。
而不是使用
await hubProxy.Invoke("MethodName", args);
尝试
hubProxy.Invoke("MethodName", args).Wait(500);
或任何超时您想
我有同样的问题,等待似乎对有固定的,我知道等待是首选方法,但有时SignalR不能正确返回
是的,现在我正在使用Invoke,这工作得很好,但我真的应该确保用户连接到正确的组。 –
打开跟踪。显示更多的代码 - 你有什么是不足以告诉可能发生的事情。 – Pawel
@Pawel完成。我会添加一些更多信息,如稍后(1或4天)跟踪。 –