2012-06-08 57 views
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; 
} 

这是输出:

enter image description here

请注意到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 - 但没有资源负担问题(从上面的链接)

+0

你到底想要完成什么?你应该避免使用ASP.NET中的ThreadPool,除非你喜欢玩潘多拉盒子。 –

+0

@BryanCrosby嗨。我试图完成线程等待,直到我信号。 (像这里的版本1)。我知道我应该避免在asp.net中持有昂贵的threadpool thrad .....是不是版本2假设在这里帮助?正如我所说的问题 - 它不阻止线程....在第4行之后,它只是继续......并关闭响应.....我清楚了吗? –

回答

0

RegisterWaitForSingleObject不会阻止您当前线程;它基本上旋转了一个线程池线程(新的或重复使用),并调用你的“回调”之前调用有WaitForSingleObject

没有什么可以做,以“修复”是因为这是它是假设的工作方式。