我正在研究一个项目,该项目为用户显示,阅读(使用语音)并通过邮件发送通知。
一切正常,但是我有一个问题找不到答案。
每次我需要调用扬声器类时,都需要创建一个新线程。实际上,我正在使用大量线程来进行后台工作并更新一些信息。
我的疑问:
像这样调用新线程:
public void relatmailth()
{
MAILRELAT mails = new MAILRELAT();
relatmail = new Thread(new ThreadStart(mails.mail));
relatmail.IsBackground = true;
relatmail.Start();
}
每次需要发送电子邮件时,这是一种不好的做法吗?
程序将自动管理线程吗?
在调用新线程之前,我需要“杀死”(我不建议这样做)旧线程吗?
如果是,该如何解决?
答案 0 :(得分:6)
一切正常
...可能是偶然的。
每次我需要调用扬声器类时,都需要创建一个新线程。实际上,我正在使用大量线程来进行后台工作并更新一些信息。
这是非常糟糕的做法。将线程视为工人。如果您不雇用工人来执行任务,请不要雇用线程来执行任务。
每次需要发送电子邮件时,这是一种不好的做法吗?
每次发送一封信然后解雇他们时,您会雇用一个新的管理员助手吗?
是的,这是一个不好的习惯。
在调用新线程之前,我需要“杀死”(我不建议这样做)旧线程吗?
为什么知道答案后又问一个问题? 切勿杀死线程。这是非常危险的。如果您每次有一封信要录入时都聘请新的管理员助理,那么当邮件进入邮箱时您会开枪射击吗?
CLR保证在中止线程时会保持其 不变量。 CLR不保证您中止线程时保持程序不变性。如果要中止线程,则应该中止每个线程并在紧急情况下关闭进程,因为您担心正在运行的线程会破坏用户数据。快速失败是在这种紧急情况下关闭的最安全方法。
如果您不处于紧急关闭状态,请不要杀死线程。
如果是,该如何解决?
答案 1 :(得分:1)
是的,这不是一个好主意,因为每次调用send email方法时都会创建一个线程。宁可让它像async
一样
public async Task relatmailth()
{
MAILRELAT mails = new MAILRELAT();
// rest of mail sending logic
}
否则,如果确实需要在单独的线程上安排此方法,则可以使用QueueUserWorkItem()
来从ThreadPool使用一个方法,例如
ThreadPool.QueueUserWorkItem(relatmailth, "TP Thread");