クライアントへのチャンクでサーバー応答を行うことができました(私は自分のチャットの実装を学んでいます)...
私は 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 のように動作させたい - ただし、リソースの負担の問題はありません (上記のリンクから)