2017-08-31 269 views
1

我有一些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秒调用一次集线器方法一次。

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

+0

打开跟踪。显示更多的代码 - 你有什么是不足以告诉可能发生的事情。 – Pawel

+0

@Pawel完成。我会添加一些更多信息,如稍后(1或4天)跟踪。 –

回答

0

而不是使用

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

尝试

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

或任何超时您想

我有同样的问题,等待似乎对有固定的,我知道等待是首选方法,但有时SignalR不能正确返回

+0

是的,现在我正在使用Invoke,这工作得很好,但我真的应该确保用户连接到正确的组。 –