3

更新のために 3 秒ごとに ajax を介してポーリングするブラウザーを含むアーキテクチャがあり、それをlong-pollingに変更したいと思います。

1, 2.. {n} 個のクライアントがロング ポーリングを行い、更新を待機し、待機しているクライアントに戻るように通知するためにサーバーで何かが発生するようにしたいと考えています。最初に考えたのは を使用することでしたEventWaitHandle。1 つのクライアントをサポートするだけであれば、これは簡単に実行できます。クライアントをブロックするだけで、おそらくタイムアウトで、そうではないかもしれません。いずれにせよ、サポートできるのは 1 つのクライアントのみであり (待機中のスレッドは 1 つしか起動しないため)、n 個のクライアントが必要です。AutoResetEvent WaitHandleWaitOneAutoResetEvent

を使用する必要があると確信していますが、それをいつ呼び出すかはわかりません(スレッドを起動するとき)。と の間の任意の量だけを使用する必要がありますか?ManualResetEvent WaitHandleResetSetThread.SleepSetReset

疑似コードでは、ウェイク ロジックは次のようになります。

  • 得るManualResetEventWaitHandle
  • 電話Set
  • 新しいリクエストが吹き飛ばされるのを防ぎながら、待機中のすべてのクライアントが目覚めたことを確認します
  • Reset待機中のすべてのクライアントが更新を受信したので、今すぐ呼び出します

私が苦労しているのはその3行目です。現在LastTxID、クライアント/サーバーが維持し、潜在的に2つの待機ハンドルを使用するという考えを投げかけています。ただし、この実装に夢中になる前に、ここでフィードバックを取得して、ウェイク ロジックがどのように実装されるかを確認したかったのです。

編集:IISを微調整するか、WCFまたはその他のソリューションを介してホスティングすることにより、最大同時ユーザー数を把握することに関連する問題があると仮定します。ウェイクアップ ロジックだけに注目したいと思います。

4

1 に答える 1

0

疑似コードでの 1 つのアイデア

  • 接続 ID のスレッドセーフなリストを維持し、場合によってはセッション ID を使用します
  • すべての接続に独自の AutoResetEventWaitHandle を与える
  • スレッドセーフな方法で、これらの待機ハンドルをループし、更新があるときにそれらを設定します
  • セッションの終了時に、スレッドセーフな方法で、その接続/セッション ID をリストから削除します

これについてフィードバックをいただければ幸いです

このアプローチの短所

  • 接続のリストを維持する必要がある
  • {n} クライアントの {n} 待機ハンドルを生成する必要があります
于 2010-04-28T15:57:21.933 に答える