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
。
但BeginInvoke
和QueueUserWorkItem
不能如何使用ASP.NET工作线程?当然这两个都使用线程池线程,并且ASP.NET工作进程中肯定只有一个线程池?
根据MSDN,
Web服务器从线程池(worker)获取一个线程 线程)并安排它来处理传入的请求。这个工人 thread 启动异步操作。
工作线程返回到线程池以服务另一个线程池 网络请求。
异步操作完成后,它会通知ASP.NET。
但是对于任何非平凡的事情,听起来启动异步操作仍然需要运行一个线程。只有在非常简单的情况下(比如使用BCL下载网页内容),它才会完全展开和/或完全受IOCP约束,对吗?
我问的部分是因为我看到所有这些聊天服务器都是使用AsyncController
实现的,如果他们所做的只是“等待新消息”,我不明白如何在非线程池线程上完成
答案 0 :(得分:0)
你是对的。它确实使用asp.net线程来启动异步调用,但该线程已完成&回到游泳池。然后异步进程在工作线程池的另一个线程上运行,然后通知asp.net它需要一个线程来处理结果。
它更有效,因为asp.net线程池限制了传入连接,因此尽快释放它们可以让您更快地处理更多传入连接。
至少我是这样看的。
修改强> 我认为这不完全正确。只有一个后台线程池,如框架中所定义,但您可以创建任意数量的其他线程,并创建自己的线程池,与后台线程池不同。
我相信这就是这里发生的事情。有少量工作线程处理请求。这些工作线程在后台池中生成线程来处理异步请求。
西蒙