【问题标题】:When Asp.net terminates background threads?Asp.net 何时终止后台线程?
【发布时间】:2009-12-26 08:52:20
【问题描述】:

我正在处理一个项目,其中有一部分是批量发送电子邮件,当用户单击该按钮时,他/她会立即收到“感谢电子邮件已发送”作为响应和相同方法也在触发一个异步线程。

ThreadPool.QueueUserWorkItem(SendEMail, _message);

当用户单击发送按钮时,该线程已排队,但由于这是默认的Background Thread,我期待页面响应结束时,该线程将被终止,但它没有发生,因为当前线程触发了该线程也是一个Background Thread 和一个Worker Thread,所以这意味着有一个未完成的前台线程(可能是主线程或工作线程)仍然存在,但我不知道他们什么时候完成因为他们的完成时间会影响我的后台工作线程;当最后一个前台线程结束时,会导致进程终止,后台线程也一样。

我应该害怕这个还是 Asp.NET 可以自动处理它,我有点困惑,因为我已经阅读了很多关于它的东西,现在一切都搞混了。

你能稍微澄清一下吗?

提前致谢。

【问题讨论】:

    标签: asp.net multithreading


    【解决方案1】:

    将 ThreadPool 用于长时间运行的任务会对应用程序的性能产生负面影响(因为 ASP.NET 也使用 ThreadPool 来处理传入请求)。

    如果创建的线程过多,为每个任务手动创建线程也会成为问题。

    我过去使用过的一种技术是在启动应用程序时创建自定义线程池,并在该线程池上将任务排入队列。一个简单的自定义线程池可以由一个线程和一个任务队列组成。

    【讨论】:

      【解决方案2】:

      当您调用QueueUserWorkItem 时,将从线程池中提取一个新线程(如果可用)并在该线程上执行回调函数。如果没有可用的线程,该函数将阻塞,直到线程被释放。一旦它完成方法的执行,线程将被挂起并返回到池中以供进一步重用。您唯一关心的应该是池中的线程也用于服务请求这一事实,因此如果您对它们执行冗长的任务,您可能会危及整个系统请求服务能力,因为池中的线程数量有限,如果所有他们正忙于执行冗长的操作,未来的 HTTP 请求将被排队。作为替代方案,您可以考虑手动创建线程:new Thread(state => { }).Start();

      【讨论】:

      • 那么前台线程呢?哪一个是前景事件或主要事件,我如何知道它们何时发生?
      • 通常不赞成手动创建线程,尤其是在 ASP.NET 应用程序中。如果创建的线程过多,则会大大降低您的应用程序的速度。
      • 我不确定我是否理解您的问题。你能详细说明一下你的场景吗?
      • @Tommy,我同意你的看法。一般来说,此类任务应该从 ASP.NET 应用程序卸载到 NT 服务中,...
      • @Darin :感谢您的帮助,但通常情况下,从服务器请求页面时必须有前台线程在工作,对吧?因此,如果从线程池中取出的每个线程都是后台线程,那么 Asp.NET 运行时本身启动的前台线程在哪里? (P.s这个问题给你,我不小心问汤米:))
      【解决方案3】:

      您可以使用 MSMQ 来创建您的电子邮件队列,并让一个线程处理该队列。

      以下帖子可能很有用,因为它适合您的问题域。虽然它不使用 MSMQ,但它是一篇关于使用 ASP.net 处理计划任务的好帖子。

      Simulate a Windows Service using ASP.NET to run scheduled jobs

      【讨论】:

      • 嗯,它可以在我的应用程序中使用,我相信使用高级的东西有点简单:)
      • 我不会称之为高级。它有助于解决手头的问题。此外,如果您确实觉得它很先进,您可以创建队列类型的应用程序级变量和 MailMessage 类型的队列对象,然后让您的线程处理它。它类似于 MSMQ 并解决了目的。但是您需要使其线程安全,因为访问单个队列的两个线程可能会产生不良影响。
      • 使用 MSMQ 的优点是您的队列不会在应用程序崩溃的情况下丢失。您可以在应用程序重新启动时从最后处理的项目恢复。
      • 感谢您的回答。我会试一试:)
      猜你喜欢
      • 2014-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-27
      • 1970-01-01
      相关资源
      最近更新 更多