2016-09-27 15 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); 
    } 
} 

このコードはうまく動作しますが、予期しない動作があります。 10秒未満で5つのメッセージが送信された場合、クライアントは以前の「DelayResponse」メソッドが終了するまで、さらにメッセージを送信できません。接続ごとに発生し、10秒前に接続を終了して再度開くと、クライアントは5つのメッセージを再度送信できます。私はchrome、firefox、IEでテストします。 私は間違いを犯しましたか、それとも信号機の制限ですか?

答えて

0

ほとんどの場合、ブラウザの制限に達する可能性があります。 longPollingとserverSentEventトランスポートを使用する場合、各sendは個別のHTTP要求です。あなたが応答を遅らせているので、これらの要求はより長く実行され、ブラウザーは同時接続の数を制限することができます。制限に達すると、以前の接続が完了するまで新しい接続が開かれません。 並行リクエストの制限の詳細: Max parallel http connections in a browser?

+0

これはまさに正しいことです。私はWindows 7でwebsocketをサポートしていないので、私のPC上のシグナルトランスポートタイプは "ServerSentEvents"なので、ブラウザの接続制限に達しました。 WebSocketをサポートしているWindows 10でコードをテストするときに制限はありませんでした。私は約500のメッセージを続けて送信し、その後10秒後に500の応答を得ました。 –

0

これは、「長期実行」タスクを待っていることを意味するシグナルの感覚ではありません。そのため、signalRはサーバープッシュメカニズムをサポートしています。 これ以上の時間が必要なものがあれば、これをクライアントから引き出すことができます。 計算が完了した場合は、サーバーからクライアントにメッセージを送信できます。

関連する問題