AsyncController如何避免使用ASP.NET工作线程?

时间:2011-08-02 18:34:20

标签: asp.net-mvc threadpool asynccontroller

AsyncController如何避免使用ASP.NET工作线程?如果我使用基于事件的模式(伪代码):

[AsyncTimeout(60000)]
public void WaitForWakeUp() 
{
    AsyncManager.OutstandingOperations.Increase();
    EventRaisedElsewhere += 
    state => 
    {
        AsyncManager.OutstandingOperations.Decrease();
        return Content("Woke up because of " + state);
    };
}

...然后根据Clay Lenharts它不使用ASP.NET工作线程。这怎么可能?

我看了一下AsyncController源代码,但没有理解任何内容,只是它在某些地方使用IAsyncResult很多而且QueueUserWorkItem

BeginInvokeQueueUserWorkItem 不能如何使用ASP.NET工作线程?当然这两个都使用线程池线程,并且ASP.NET工作进程中肯定只有一个线程池?

根据MSDN,

  

Web服务器从线程池(worker)获取一个线程   线程)并安排它来处理传入的请求。这个工人   thread 启动异步操作

     

工作线程返回到线程池以服务另一个线程池   网络请求。

     

异步操作完成后,它会通知ASP.NET。

但是对于任何非平凡的事情,听起来启动异步操作仍然需要运行一个线程。只有在非常简单的情况下(比如使用BCL下载网页内容),它才会完全展开和/或完全受IOCP约束,对吗?

我问的部分是因为我看到所有这些聊天服务器都是使用AsyncController实现的,如果他们所做的只是“等待新消息”,我不明白如何在非线程池线程上完成

1 个答案:

答案 0 :(得分:0)

你是对的。它确实使用asp.net线程来启动异步调用,但该线程已完成&回到游泳池。然后异步进程在工作线程池的另一个线程上运行,然后通知asp.net它需要一个线程来处理结果。

它更有效,因为asp.net线程池限制了传入连接,因此尽快释放它们可以让您更快地处理更多传入连接。

至少我是这样看的。

修改 我认为这不完全正确。只有一个后台线程池,如框架中所定义,但您可以创建任意数量的其他线程,并创建自己的线程池,与后台线程池不同。

我相信这就是这里发生的事情。有少量工作线程处理请求。这些工作线程在后台池中生成线程来处理异步请求。

西蒙