在委托上调用BeginInvoke时,操作在单独的线程上执行。如果在ASP.NET中调用它是否使用CLR工作线程?或者它是否使用IIS工作线程?
如果是后者,那么我将需要使用异步ASP.NET模式来确保在CLR工作线程上执行操作。但如果行动在BeginInvoke上结束,我宁愿不这样做。
答案 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应用程序不同的地方。