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

5
当调用委托的BeginInvoke时,操作将在单独的线程上执行。如果在ASP.NET中调用,它会使用CLR工作线程吗?还是使用IIS工作线程?
如果是后者,则我需要采用异步ASP.NET模式来确保操作在CLR工作线程上执行。但如果操作最终在BeginInvoke时结束,我就不想这样做。
3个回答

6
它使用CLR工作线程。
此处所述:
ASP.NET首先使用进程范围的CLR线程池来服务请求(有关CLR线程池的更多背景,请参见本问题的.NET专栏)。
编辑:另一个资源是此博客
不幸的是,由BeginInvoke使用的线程实际上来自与处理页面请求的ASP.Net使用的同一工作线程池。

谢谢。MVC支持异步模型。如果我结合BeginInvoke技术利用它,我的页面将会快速返回而且工作不会占用IIS的工作线程。这是正确的吗? - John Livermore
重新阅读那篇博客文章,我可以简单地使用Thread.Start()技术。对于我的应用程序,我不会有超过一小撮这些进程同时发生的风险(通常只有1个),因此在这一点上,这可能是最容易/最可维护的解决方案,满足我的需求。对于任何跟随者,请搜索博客文章中的短语“好吧。我将只使用Thread.Start()并创建自己的线程”。 - John Livermore
@John,是的,你说得对。如果你只想快速返回页面,而不让用户知道结果,那么这很好。但它不会提高性能。 - Mithir

1

1

使用自定义代理并调用其BeginInvoke方法是触发应用程序工作线程的快速方式。但不幸的是,它们会损害应用程序的整体性能,因为它们消耗与ASP.NET用于处理HTTP请求的相同池中的线程。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接