.net - 使用任务库进行多线程处理

标签 .net asp.net-mvc multithreading threadpool task-parallel-library

在 ASP.NET MVC 中,我有一个操作,它接受用户输入的电子邮件地址列表,验证它们,然后将电子邮件消息的 HTML 和文本版本发送给每个收件人。然后用户将被重定向到感谢页面。因为没有必要等待重定向到感谢页面直到发送所有电子邮件,所以我使用 Task.Factory.StartNew 方法来启动一个实际发送电子邮件的新任务,并且它工作正常;用户立即被重定向到感谢页面,并且电子邮件消息将在单独的线程上发送。 所以一切都按我想要的方式进行,但尽管如此,我对多线程有以下问题。我最近读了很多帖子,但我仍然没有得到所有答案,以下是我从这些帖子中提取的一些事实(请注意,这些只是我的假设,我将它们写在这里,以便您评论并改进它们):

  1. 任务库使用线程池中的线程

    如果您正在使用任务库,则您将使用 ASP.NET 线程池中的线程创建新线程。这意味着可以减少一个线程来为应用程序的其他 ASP.NET 请求提供服务。因此,通过使用任务库,您并没有通过将任务卸载到其他操作系统线程来优化 ASP.NET 线程的使用,只是用户体验更好,但任务库使用另一个可用于服务其他 ASP.NET 请求的线程。所以唯一的结果就是用户不需要等待。

  2. 手动线程

    如果您确实想使用操作系统线程,则必须显式启动新线程。但即使您启动新的操作系统线程,您也需要拥有具有多个内核或处理器的计算机才能真正看到应用程序可扩展性的改进。

  3. 后台线程池

    一些帖子讨论了 ASP.NET 线程池和用于后台任务的单独应用程序的后台线程池。换句话说,每个 ASP.NET 应用程序都有一个线程池来服务应用程序请求,另一个线程池来服务后台任务。我不认为这是真的,我认为每个 ASP.NET 应用程序只有一个线程池,并且该池中的线程用于服务器:应用程序请求和后台任务。也许对于 Windows 窗体应用程序来说,当通常只有一个线程(UI 线程)运行并且您必须显式启动新线程时,可能会这样说。但 ASP.NET 本质上是多线程的。

问题如下:

  1. 我在 Dino Esposito 的《编程 ASP.NET MVC 2》中阅读了有关异步 MVC Controller 的内容。他写了异步 Controller 如何使用操作系统线程来执行长时间运行的任务,因此最初服务于 ASP.NET 请求的 ASP.NET 线程现在可以自由地服务其他请求。

    虽然我在这里不需要异步 Controller ,但我的问题是如何在我的示例中使用这样的操作系统线程。我是否必须显式启动单独的线程,或者这也可以通过任务库以某种方式实现吗?

  2. 即使我将此类任务卸载到某个操作系统线程,如果机器只有一个处理器,会有什么好处吗?我认为多核机器对于真正提高应用程序的可扩展性是必要的。

最佳答案

您遇到的真正问题是 ASP.NET 可以随时回收您的 AppDomain。当发生这种情况时,您的后台线程将因极端偏见而中止。如果您使用线程池线程或启动您自己的线程,这并不重要 - 如果 ASP.NET 不“了解”该线程,它可以并且将会销毁 AppDomain 并带走您的线程。

“正确”的解决方案是拥有一个单独的 Windows 服务进程,即 WCF 服务器。然后,您的网络应用程序可以将命令发送到执行它们的服务 - 例如发送一些电子邮件。

快速而肮脏的方法是在您的网络应用程序中隐藏一个发送电子邮件的操作。启动对该操作的异步请求,然后返回“感谢”页面,而不等待结果。 ASP.NET 并不关心该请求是否来自您的应用程序内部 - 它只是将其视为另一个请求。因为 ASP.NET“知道”该请求,所以它不会中止该请求。

关于.net - 使用任务库进行多线程处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10071838/

相关文章:

c# - 在 ASP.NET MVC 中提供由模型动态生成的文件

javascript - 使用 Angular 或 Jquery 隐藏或显示项目?

Python 将参数传递给 Thread 类

ios - 同步动画相互阻塞

c# - 如何在没有 HttpClientFactory 的情况下将多个 HttpMessageHandler 添加到 HttpClient

c# - 将字符串数组从托管代码编码到 native 代码

.net - 如何打破这个字符串并按版本号排序

c# - WCF 对比遗留的 ASP.Net Web 服务

asp.net-mvc - 缺少 Microsoft.Data.Tools.Schema.Sql.UnitTesting。再次

java - Java的for循环中是否有线程安全优化?