2017-08-31 272 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,這工作得很好,但我真的應該確保用戶連接到正確的組。 –