首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AsyncController如何避免使用ASP.NET工作线程?

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

Stack Overflow用户
提问于 2011-08-02 18:34:20
回答 1查看 590关注 0票数 5

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

代码语言:javascript
复制
[AsyncTimeout(60000)]
public void WaitForWakeUp() 
{
    AsyncManager.OutstandingOperations.Increase();
    EventRaisedElsewhere += 
    state => 
    {
        AsyncManager.OutstandingOperations.Decrease();
        return Content("Woke up because of " + state);
    };
}

...then,根据克莱·伦哈特,它不使用ASP.NET工作线程。这怎麽可能?

我看了一下AsyncController源代码,但什么也不懂,只是它经常使用IAsyncResult,在某些地方做QueueUserWorkItem

但是BeginInvokeQueueUserWorkItem怎么能不使用ASP.NET工作线程呢?当然,这两个线程都使用线程池线程,而且ASP.NET工作进程中肯定只有一个线程池?

根据MSDN,

Web服务器从线程池(工作线程)获取一个线程,并对其进行调度以处理传入的请求。此工作线程启动异步操作。 将工作线程返回到线程池以服务另一个Web请求。 当异步操作完成后,它会通知ASP.NET。

但是对于任何非琐碎的事情,似乎启动异步操作仍然需要一个线程来运行。只有在非常简单的情况下(比如使用BCL下载web内容),才能完全解除和/或完全绑定IOCP,对吗?

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

EN

回答 1

Stack Overflow用户

发布于 2011-08-03 00:54:35

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

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

至少我是这么看的。

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

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

西蒙

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6916848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档