我已托管以客户端的方式执行服务器响应(即时学习实现我自己的聊天)...
我有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;
}
这是输出:
请注意,asp.net线程在set()命令之前不会释放。
让我们谈谈第2版:
ive read :
如果您的应用程序有大量线程花费大部分时间 在等待句柄上被阻止,可以减少资源负担 调用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响应)......
我想它假设等待 直到我发出信号 ......?
我如何修复第二个版本?(我希望它像ver 1一样 - 但没有资源负担问题(来自上面的链接)
答案 0 :(得分:0)
RegisterWaitForSingleObject
不阻止您当前的帖子;它基本上会旋转一个线程池线程(新的或重用的)并在那里调用WaitForSingleObject
,然后再调用你的"回调"。
你无法做任何事情来修复"因为这就是它的工作方式。