0
我管理做以块的形式到客户端服务器响应(IM 学习实现我自己的聊天)......使用RegisterWaitForSingleObject进行asp.net聊天?
我有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线程的心不是释放,直到集()命令。
让我们来谈谈第2版:
香港专业教育学院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响应) ...
我认为它想等待,直到我信号,它 ...?
如何解决的第二个版本(我希望它像版本1 - 但没有资源负担问题(从上面的链接)
你到底想要完成什么?你应该避免使用ASP.NET中的ThreadPool,除非你喜欢玩潘多拉盒子。 –
@BryanCrosby嗨。我试图完成线程等待,直到我信号。 (像这里的版本1)。我知道我应该避免在asp.net中持有昂贵的threadpool thrad .....是不是版本2假设在这里帮助?正如我所说的问题 - 它不阻止线程....在第4行之后,它只是继续......并关闭响应.....我清楚了吗? –