【问题标题】:Set Thread as background or not是否将线程设置为背景
【发布时间】:2011-01-02 14:07:07
【问题描述】:

我需要一个关于我在这个网站上得到的一些建议的解释。我正在做一个时事通讯发送应用程序,我的邮件是在一个单独的线程中发送的,所以这个过程不会减慢整个网站的速度。 有几个人建议我将线程 IsBackground 属性设置为 true。 我这样做了,但也很好奇这是做什么的,所以我用谷歌搜索了一下。 事实证明,将 IsBackground 属性设置为 true 表示 “如果进程在此线程仍在运行时关闭,那也没关系。”。 或者正如微软所说的那样“任何剩余的后台线程都将停止并且不会完成。”

我不知道我是不是弄错了,但是将 IsBackground 属性设置为 false 不是更好吗,以便生成的线程可以完成其与主线程有关的工作?

【问题讨论】:

  • 您如何/在哪里发送电子邮件?
  • 从网站上,我创建了 mailmessage 和 smtpclient 对象,并遍历来自 db 的电子邮件并一一发送

标签: c# asp.net multithreading


【解决方案1】:

如果您设置“IsBackground=true”,则将线程标记为无关紧要 - 因此,如果您希望即使网站出现故障也能完成后台作业,我认为您的直觉是正确的,请将其保留为“IsBackground=假”。

这不是万无一失的;生成的线程仍然是主线程的子线程,因此取决于站点如何关闭,它仍然可以关闭整个进程。如果您真的想确保无论站点本身发生什么事情都能完成您的工作,您应该考虑将其提取到自己的进程中,例如 WCF 服务。

【讨论】:

    【解决方案2】:

    听起来这个帖子有类似的东西:

    while(true)
    {
      //do something
    }
    

    如果该线程在进程尝试关闭时不会中止,则该进程将保持运行(除非您强行杀死​​它)。
    另一方面,当进程的所有前台线程都关闭时,后台线程将自动中止。

    【讨论】:

    • 是的,它会在数组中有电子邮件时发送电子邮件(使用 while 循环)。所以如果我不将 IsBackground 属性设置为 true,它会在循环结束时继续运行吗?
    • 不,当您传递给 Thread.Start 的方法退出时,线程也会退出。
    猜你喜欢
    • 2012-09-23
    • 2019-06-13
    • 1970-01-01
    • 2012-03-05
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多