0

クライアントへのチャンクでサーバー応答を行うことができました(は自分のチャットの実装を学んでいます)...

私は 2 つのバージョンを持っています (1 つは作品、もう 1 つはそうではありません)。

ここに作業バージョンのコードがあります。

  static EventWaitHandle _waitHandle = new AutoResetEvent(false);
   protected void Page_Load(object sender, EventArgs e)
    {
       var t = HttpContext.Current; //capture the context
       Response.Write("starting...");
       Response.Flush();
       new Thread(() => Waiter(t)).Start(); //start a new thread for later setting the wait handle...
       _waitHandle.WaitOne();  //wait - STOP THE THREAD !!
    }

private object Waiter(HttpContext httpContext)
{
    httpContext.Response.Write("111");
    httpContext.Response.Flush();
    Thread.Sleep(4000); 
    httpContext.Response.Write("222");
    httpContext.Response.Flush();
   /*... 2 more responsed like 222*/
    _waitHandle.Set(); //wakt the other thread
    return null;
}

これは出力です:

ここに画像の説明を入力

set() コマンドまで asp.net スレッドが解放されないことに注意してください。

バージョン 2 について話しましょう:

私はそれを読んだ:

アプリケーションに、ほとんどの時間を待機ハンドルでブロックされているスレッドが多数ある場合は、ThreadPool.Register WaitForSingleObject を呼び出すことでリソースの負担を軽減できます。

私のコードは次のとおりです。

 protected void Page_Load(object sender, EventArgs e)
    {
1       var t = HttpContext.Current;
2       Response.Write("starting...");
3       Response.Flush();
4       RegisteredWaitHandle reg = ThreadPool.RegisterWaitForSingleObject (_starter, Go, t, -1, true);
5       new Thread(() => { Thread.Sleep(4000); _starter.Set(); }).Start();
       ...
    }

問題があります ...

4行目以降-続行し(ブロックしません)、応答が終了します(asp.net応答)...

それを合図するまで待つ べきだと思った...?

2 番目のバージョンを修正するにはどうすればよいですか?(バージョン 1 のように動作させたい - ただし、リソースの負担の問題はありません (上記のリンクから)

4

1 に答える 1

0

RegisterWaitForSingleObject現在のスレッドをブロックしません。基本的に、スレッドプールスレッド(新規または再利用)をスピンアップし、WaitForSingleObject「コールバック」を呼び出す前にそこに呼び出します。

それが機能すると思われる方法であるため、それを「修正」するためにできることは何もありません。

于 2012-06-08T21:58:29.223 に答える