SignalR hubs调用死锁

时间:2017-08-31 22:04:22

标签: c# signalr signalr-hub

我有一些异步执行的hubProxy.Invoke("Method", param)方法。所有人都调用相同的方法,但使用不同的args。问题是所有这些都在某些PC上正常执行但另一个面临的问题是只执行第一个方法调用而其他方法永远执行。 方法看起来像

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的相同方法?我应该有一些队列吗?

修改或者可能是因为我在Invoke之后发送了await connectionTask?现在无法检查,因为在我的电脑上一切正常。链接:

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)而不是<div class="content">。无法理解为什么我的第一次调用总是成功的,我在跟踪中看到了一些答案,但在此之后,同一方法的所有调用都失败了。但如果我等待一段时间(大约10秒以上)并调用这种方法,我又会得到回应。所以看起来我只能每10秒钟调用一次集线器方法。

我会尝试再次重新创建此问题并添加完整跟踪。

1 个答案:

答案 0 :(得分:1)

而不是使用

await hubProxy.Invoke("MethodName", args);

hubProxy.Invoke("MethodName", args).Wait(500);

或您想要的任何超时

我有同样的问题,等待似乎已修复它,我知道等待是首选方法,但有时SignalR无法正常返回