在 ASP.NET MVC 中,我有一个 Action,它接受用户输入的电子邮件地址列表,对其进行验证,然后将电子邮件的 HTML 和文本版本发送给每个收件人。然后用户被重定向到感谢页面。因为没有必要等待重定向到感谢页面,直到发送所有电子邮件,我正在使用 Task.Factory.StartNew 方法来启动一个实际发送电子邮件的新任务,它工作正常;用户立即被重定向到感谢页面,并且电子邮件消息在单独的线程上发送。所以一切都按我的意愿工作,但是我有以下关于多线程的问题。前几天看了很多帖子,还是没找到答案
任务库使用线程池中的线程
如果您使用的是任务库,则您正在使用 ASP.NET 线程池中的线程创建新线程。这意味着少一个线程可用于为应用程序提供其他 ASP.NET 请求。因此,通过使用任务库,您并没有通过将任务卸载到其他一些操作系统线程来优化 ASP.NET 线程的使用,只有用户体验更好,但任务库使用了另一个可用于服务其他 ASP.NET 请求的线程。所以唯一的结果是用户不需要等待。
手动螺纹
如果你真的想使用操作系统线程,你必须显式地启动新线程。但即使您启动新的操作系统线程,您也需要拥有多核或多处理器的机器才能真正看到应用程序可扩展性的改进。
后台线程池
一些帖子讨论了 ASP.NET 线程池和用于后台任务的单独应用程序的后台线程池。换句话说,每个 ASP.NET 应用程序都有一个线程池来服务应用程序请求,而另一个线程池来服务后台任务。我不认为这是真的,我认为每个 ASP.NET 应用程序只有一个线程池,并且该池中的线程用于同时服务:应用程序请求和后台任务。当通常只有一个线程在运行(UI 线程)并且您必须显式启动新线程时,也许对于 Windows 窗体应用程序可以这样说。但是 ASP.NET 在其基础上是多线程的。
以下是问题:
我在 Dino Esposito 的 Programming ASP.NET MVC 2 中阅读了异步 MVC 控制器。他写了关于异步控制器如何使用 OS 线程来执行长时间运行的任务,因此最初为 ASP.NET 请求提供服务的 ASP.NET 线程现在可以自由地为其他请求提供服务。
虽然我在这里不需要异步控制器,但我的问题是如何在我的示例中使用这样的操作系统线程。我是否必须显式地启动单独的线程,或者这是否也可以通过任务库以某种方式实现?
即使我将这些任务卸载到某些操作系统线程,如果机器只有一个处理器,会有什么好处吗?我认为多核机器对于真正提高应用程序的可扩展性是必要的。