5

究竟如何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 服务器从线程池中获取一个线程(工作线程)并调度它来处理传入的请求。该工作线程启动异步操作

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

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

但是对于任何重要的事情,听起来启动异步操作仍然需要一个线程来运行。只有在极其简单的情况下(例如使用 BCL 下载 Web 内容)才会完全展开和/或完全 IOCP 绑定,对吗?

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

4

1 回答 1

0

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

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

至少我是这么看的。

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

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

西蒙

于 2011-08-03T00:54:35.307 回答