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;
}

这是输出:

在此处输入图像描述

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

4

1 回答 1

0

RegisterWaitForSingleObject不会阻塞你当前的线程;它基本上启动了一个线程池线程(新的或重用的)并WaitForSingleObject在调用你的“回调”之前调用。

您无法“修复”它,因为它应该是这样工作的。

于 2012-06-08T21:58:29.223 回答