通常は SignalR を使用してデータのプッシュを処理しますが、この場合はサーバー側で Nancy Async Beta の自己ホスト型インスタンスを使用しています。このシナリオではまだ SignalR を使用できると聞いていますが、この場合は自分でロング ポーリングを処理することをお勧めします。以下に説明する問題を生成する、私が書いている簡単な実験アプリのコードを次に示します。
Get["/receivechat", true] = async (x, ct) =>
{
string result = await _massPublisher.WaitForResult("test");
return result;
};
これにより、実際のロング ポーリング リクエストが処理されます。リクエストは、このラムダに 4 または 5 のチャンクで入るようです。たとえば、ラムダの最初の行にブレーク ポイントを配置すると、さらに 4 または 5 個のリクエストを送信し、突然すべてのリクエストが一度にラムダに入ります。明らかに、WaitForResult メソッドを待機できるように、要求されたときにすべて入力する必要があります。WaitForResult メソッドは、共通の TaskCompletionSource を待機するだけです。必要に応じて、そのコードとクライアント側のコードを投稿できます。私が知る限り、リクエストは並行して処理されており、他のいくつかのリクエストが行われるまでリクエストはラムダに入ることさえないため、Nancy Async Beta の使用方法に問題があるようです。
この間、このアプリケーションが他のすべての要求に応答していることは、おそらく注目に値します。
Nancy Async Beta で見つけることができるドキュメントを読みましたが、この例は機能するはずですが、そうではありません-とにかく私にとっては。なぜこれがうまくいかないのかについて誰かが洞察を提供できるなら、それは大歓迎です。そして、私が言ったように、この実験からさらに多くのコードを投稿できますが、今のところ、質問を混乱させるだけのようです.
更新: 私は TPL と Nancy に比較的慣れていないので、問題を切り分けてもう少しトラブルシューティングするために、実験からコードを取り出しました。これが私が更新したコードです。5 秒の Task Delay を待つだけで、現在の時刻がクライアントに送信されます。
Get["/receivechat", true] = async (x, ct) =>
{
//string result = await _massPublisher.WaitForResult("test");
//return result;
await Task.Delay(5000);
return DateTime.Now.ToString();
};
私の理解では、各リクエストは並行して処理され、互いに独立しています。これを理解した上で、これらのリクエストをポーリングしている他のクライアントの数に関係なく、各クライアントは 5 秒ごとに応答を確認する必要があると思います。ただし、結果は次のとおりです。
つまり、応答は 5 秒ごとに送信されますが、一度に 1 つのクライアントにのみ送信されます。したがって、3 つのクライアントの場合、各クライアントが応答を受信するのに 15 秒かかります。2 = 10 秒など...
これまでのところ、私が間違っていることはわかりません。それが私がここにいる理由です。私は自分が間違っていることを見つけるのが大好きです!:) 私は何か新しいことを学びます。ですから、私が間違っている場所を知っている、または知っている可能性がある場合は、お知らせください。私はおそらく、何度も探している間に見落としていた小さくてばかげたものを見逃した可能性があります。うまくいけば、他の人が役に立つと思う間違いです.