2016-09-27 91 views
0

我有這段代碼來測試SignalR中的異步編程。此代碼在10秒後將文本發送回客戶端。每個用戶的SignalR隊列限制

public class TestHub : Hub 
{ 
    public async Task BroadcastMessage(string text) 
    { 
     await DelayResponse(text); 
    } 

    async Task DelayResponse(string text) 
    { 
     await Task.Delay(10000); 
     Clients.All.displayText(text); 
    } 
} 

此代碼工作正常,但有一個意外的行爲。當發送5條消息的時間少於10秒時,直到先前的「DelayResponse」方法結束,客戶端才能發送更多消息。它發生在每個連接上,如果在10秒鐘之前關閉連接並重新打開它,客戶端可以再次發送5條消息。我用Chrome,Firefox和IE測試它。 我犯了一些錯誤或者是信號的限制?

回答

0

您很可能會觸及瀏覽器限制。當使用longPolling和serverSentEvent傳輸時,每個發送都是一個單獨的HTTP請求。由於您在延遲響應,因此這些請求的運行時間較長,並且瀏覽器限制了可以打開多少個併發連接。一旦你達到極限,一個新的連接將不會開放,直到前一個連接完成。 關於併發請求的更多細節限制: Max parallel http connections in a browser?

+0

這是完全正確的。我在不支持websocket的Windows 7上工作,因此我的電腦上的信號傳輸類型是「ServerSentEvents」,因此達到了瀏覽器連接限制。當我在支持websockets的windows 10上測試我的代碼時,沒有任何限制。我連續發送約500條消息,然後在10秒後得到500條迴應。 –

0

這不是signalR的敏感,您等待「長時間運行」的任務。對於那個signalR支持服務器推送機制。 所以,如果你有什麼需要更多的時間,你可以從客戶端觸發。 在計算完成的情況下,您可以從服務器向客戶端發送消息。