使用ASP.NET中的委托来处理异步操作

时间:2011-11-16 14:36:58

标签: c# asp.net multithreading delegates

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

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

3 个答案:

答案 0 :(得分:6)

它使用CLR工作线程。

here

中所述
  

首先,ASP.NET使用进程范围的CLR线程池为请求提供服务(有关CLR线程池的更多背景知识,请参阅本期中的.NET专栏)。

编辑:

另一个资源是this blog

  

不幸的是,BeginInvoke使用的线程实际上来自ASP.Net用来处理页面请求的同一工作线程池

答案 1 :(得分:1)

在IIS6,IIS7和IIS 7.5中,线程使用/管理略有不同。

非常详细,并在此处更新说明:

ASP.NET Thread Usage on IIS 7.5, IIS 7.0, and IIS 6.0

不确定这是否能回答你的问题,但仍然是一个很好的阅读。

答案 2 :(得分:1)

使用自定义委托并调用其BeginInvoke方法可以快速启动应用程序的工作线程。但不幸的是,它们损害了应用程序的整体性能,因为它们使用ASP.NET使用的相同池中的线程来处理HTTP请求。

请记住,如果来自异步方法的回调很重要,那么您需要阻止主线程返回到客户端,直到异步过程完成。如果日志记录和分析是一种“即发即忘”方法调用,那么事情就更容易了,您可以启动该方法并允许服务器响应客户端。但是,如果回调很重要并且服务器已完成处理,则服务器上没有任何事情发生,以便在完成后处理回调;这是ASP.NET应用程序在服务器上的异步处理与WinForms应用程序不同的地方。