将线程设置为后台线程还是前台线程

15

我需要解释一下这个网站上给我的建议。我正在开发一个新闻简报发送应用程序,我将邮件发送进程放在单独的线程中,以便不会拖慢整个网站的进程。

有几个人建议我将线程的 IsBackground 属性设置为 true。

我这样做了,但我还想知道这样做的效果是什么,所以我进行了一些谷歌搜索。

结果发现,将 IsBackground 属性设置为 true 表示“即使该线程仍在运行,进程关闭也没问题”。

或者微软说:“任何剩余的后台线程都将停止且不会完成。”

我不知道我是否理解错了,但难道不应该将 IsBackground 属性保持为 false,以便生成的线程可以完成与主线程相关的工作吗?


你是如何/在哪里发送电子邮件的? - SLaks
1
从网站中,我创建了MailMessage和SmtpClient对象,并遍历数据库中的电子邮件,逐个发送它们。 - Andrej
2个回答

13

如果设置"IsBackground=true",则表示您将该线程标记为非必要线程--因此,如果您希望后台作业在网站关闭时仍然完成,那么我认为您的直觉是正确的,请将其保持为"IsBackground=false"。

这并不是万无一失的;生成的线程仍然是主线程的子线程,因此根据网站关闭方式的不同,它仍然可能会导致整个进程崩溃。如果您真的希望确保作业可以无论发生什么事情都能够运行到完成,您应该考虑将其提取到自己的进程中,例如 WCF 服务。


0

听起来这个线程有类似的东西:

while(true)
{
  //do something
}

如果当进程尝试关掉时,这个线程没有被中止,那么它将一直运行(除非你强制结束它)。 而后台线程在进程的所有前台线程都已关闭后会自动被中止。

是的,它在数组中有电子邮件时发送电子邮件(使用while循环)...所以如果我不将IsBackground属性设置为true,它会在循环结束时继续运行吗? - Andrej
1
不会,当你传递给Thread.Start的方法退出时,线程也会退出。 - Itay Karo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接