使用RegisterWaitForSingleObject进行asp.net聊天?

时间:2012-06-08 19:09:25

标签: c# asp.net .net multithreading .net-4.0

我已托管以客户端的方式执行服务器响应(即时学习实现我自己的聊天)...

我有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线程在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一样 - 但没有资源负担问题(来自上面的链接)

1 个答案:

答案 0 :(得分:0)

RegisterWaitForSingleObject不阻止您当前的帖子;它基本上会旋转一个线程池线程(新的或重用的)并在那里调用WaitForSingleObject,然后再调用你的"回调"。

你无法做任何事情来修复"因为这就是它的工作方式。