我已经成功地对客户端进行了服务器响应(我正在学习实现我自己的聊天)......
我有 2 个版本(一个工作,另一个不是)。
这是工作版本的代码。
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 响应)...
我以为它应该等到 我发出信号...?
我如何修复第二个版本?(我希望它像版本 1 一样 - 但没有资源负担问题(来自上面的链接)