クライアントにプッシュバックできるフィードバックを表示するために部分ビューをカプセル化しようとしていました。
この記事では、HTML5 Server-Sent events (SSE) を使用してデータをプッシュバックする方法を示します。
複数のブラウザー タブを開いてから 1 つを閉じると、ロジックがそれぞれのストリームを ConcurrentQueue から削除しなかったため、例外が発生することに気付きました。以下のようにコードを修正しました
private static void TimerCallback(object state)
{
StreamWriter data;
Random randNum = new Random();
// foreach (var data in _streammessage)
for (int x = 0; x < _streammessage.Count; x++)
{
_streammessage.TryDequeue(out data);
data.WriteLine("data:" + randNum.Next(30, 100) + "\n");
try
{
data.Flush();
_streammessage.Enqueue(data);
}
catch (Exception ex)
{
// dont re-add the stream as an error ocurred presumable the client has lost connection
}
}
//To set timer with random interval
_timer.Value.Change(TimeSpan.FromMilliseconds(randNum.Next(1, 3) * 500), TimeSpan.FromMilliseconds(-1));
}
フレームワークの構文が HttpContentHeaders ではなく HttpContent である 2 番目のパラメーターに変更されたため、OnStreamAvailable メンバーも修正する必要がありました。
public static void OnStreamAvailable(Stream stream, HttpContent headers, TransportContext context)
問題は、クライアントを追加または削除すると、まだ一貫性のない動作が得られることです。つまり、新しいクライアントを初期化しようとするとタイムアウトになります。WinAPI で SSE を使用し、切断されたクライアントを処理するための正しい「メソッドのフレームワーク」のアイデアや例を誰かが持っていますか?
乾杯ティム