在ASP.NET MVC中我有一个Action接受用户输入的电子邮件地址列表,验证它们,然后将HTML和文本版本的电子邮件发送给每个收件人。用户然后被重定向到感谢页面。因为没有必要等待重定向到感谢页面,直到发送所有电子邮件消息,我使用Task.Factory.StartNew方法来启动一个实际发送电子邮件的新任务,并且工作正常;用户立即被重定向到感谢页面,并且电子邮件消息在单独的线程上发送。 因此,一切都按我的想法工作,但我仍然有关于多线程的以下问题。我在最后几天阅读了很多帖子,但我仍然没有全部答案,下面是我从这些帖子中提取的一些事实(请注意,这些仅仅是我的假设,我在此写下它们,以便您可以发表评论并提高它们):使用任务库的多线程
任务库使用线程的线程池
如果您正在使用任务库,您通过使用线程ASP.NET线程池创建新的线程。这意味着少一个线程可用于为应用程序提供其他ASP.NET请求。因此,通过使用任务库,您不会通过将任务卸载到某些其他操作系统线程来优化ASP.NET线程的使用,只有用户体验更好,但任务库使用另一个可用于提供其他ASP.NET请求的线程。所以唯一的结果是用户不需要等待。
手册线程
如果你真的想使用操作系统线程,你必须明确地开始新的主题。但即使您启动新的操作系统线程,您也需要拥有多个内核或处理器的机器才能真正看到应用程序可扩展性的提高。
后台线程池
一些帖子谈论ASP.NET线程池和一个单独的应用程序的后台线程池,其用于后台任务。换句话说,每个ASP.NET应用程序都有一个线程池来提供应用程序请求,另一个线程池提供后台任务。我不认为这是真的,我认为每个ASP.NET应用程序只有一个线程池,并且来自该池的线程用于服务于应用程序请求和后台任务。当通常只有一个线程正在运行(UI线程)并且您必须显式启动新线程时,也许可以这么说。但是ASP.NET在其基础上是多线程的。
这里有几个问题:
我已阅读有关恐龙埃斯波西托在编程ASP.NET MVC 2异步MVC控制器。他写的异步控制器如何使用OS线程长期运行的任务,因此ASP.NET线程担任ASP.NET请求最初是现在可以自由地服务器的其他请求。
虽然我并不需要异步控制器在这里,我的问题是我怎么能在我的例子中使用这样的OS线程。我是否必须明确启动单独的线程,或者这对于任务库来说也是可能的?
即使我卸载等TAKS一些操作系统的线程会不会有任何好处,如果机器只有一个处理器?我认为,要真正提高应用程序的可扩展性的多核机器是必要的。
svick,谢谢。总而言之,任务默认使用线程池中的线程。如果指定TaskCreationOptions.LongRunning,则可能会使用新的非线程池线程。 对于短期运行任务,最好增加线程池中的线程数量,而不是创建非线程池线程。 非线程池线程只能用于长时间运行的任务,这些任务可能会通过使用线程池线程伤害性能。 – Joxi 2012-04-10 07:40:53