【发布时间】:2011-10-18 12:18:53
【问题描述】:
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 线程)并安排它处理传入的请求。这个工人 线程启动一个异步操作。
工作线程返回线程池为另一个线程服务 网络请求。
当异步操作完成时,它会通知 ASP.NET。
但是对于任何重要的事情,听起来启动异步操作仍然需要一个线程来运行。只有在极其简单的情况下(例如使用 BCL 下载 Web 内容)才会完全展开和/或完全绑定 IOCP,对吗?
我之所以这么问,部分是因为我看到所有这些聊天服务器都是使用AsyncController 实现的,如果他们所做的只是“等待新消息”,我不明白如何在非线程池线程上完成。
【问题讨论】:
标签: asp.net-mvc threadpool asynccontroller