2011-11-16 45 views
5

在委托上调用BeginInvoke时,该操作在单独的线程上执行。如果在ASP.NET中调用,它是否使用CLR工作线程?或者它使用IIS工作线程?在ASP.NET中使用委托来处理异步操作

如果是后者,那么我将需要使用异步ASP.NET模式来确保在CLR工作线程上执行操作。但是如果动作在BeginInvoke结束,我宁愿不这样做。

回答

6

它使用CLR工作线程。

here

要首先描述,ASP.NET使用进程级的CLR线程池来服务请求(在CLR线程池的更多背景,请参见.NET列在这个问题上)。

编辑:

另一个资源是this blog

不幸的是,使用的BeginInvoke线程实际上是从所使用的ASP.Net处理同样的工作线程池中获取页面请求

+0

谢谢。 MVC支持异步模型。看起来如果我和BeginInvoke技术一起使用这个技术,我的页面将会快速返回并且工作不会占用IIS工作线程。正确? –

+0

重读那篇博文,我可以简单地做一个Thread.Start()技术。对于我的应用程序,我不会有这些过程中发生的任何一个以上(通常只有1个)的风险,所以这可能是我最需要的最简单/最可维护的解决方案。对于任何沿着搜索博客文章的人来说,“我会使用Thread.Start()并创建自己的线程”。 –

+0

@John你是对的。如果你只想快速返回页面,而不需要用户知道结果,那么它很好。但它不会提高性能。 – Mithir

1

使用自定义委托并调用其BeginInvoke方法提供了一种快速方法来为应用程序启动工作线程。但不幸的是,它们会损害应用程序的整体性能,因为它们使用ASP.NET使用的同一个池中的线程来处理HTTP请求。请记住,如果异步方法的回调很重要,那么您需要阻止主线程返回客户端,直到异步过程完成。如果日志记录和分析是一个“即忘即断”的方法调用,那么事情就会变得更加简单,您只需启动该方法并允许服务器响应客户端即可。但是,如果回调很重要并且服务器已经完成处理,则服务器上没有任何事情可以处理完成后的回调;这就是为ASP.NET应用程序服务器上的异步处理与WinForms应用程序不同的地方。