在方法上调用新线程是一个坏主意?

时间:2019-01-14 19:39:49

标签: c# multithreading

我正在研究一个项目,该项目为用户显示,阅读(使用语音)并通过邮件发送通知。

一切正常,但是我有一个问题找不到答案。

每次我需要调用扬声器类时,都需要创建一个新线程。实际上,我正在使用大量线程来进行后台工作并更新一些信息。

我的疑问:

像这样调用新线程:

public void relatmailth()
{
    MAILRELAT mails = new MAILRELAT();
    relatmail = new Thread(new ThreadStart(mails.mail));
    relatmail.IsBackground = true; 
    relatmail.Start();
}

每次需要发送电子邮件时,这是一种不好的做法吗?

程序将自动管理线程吗?

在调用新线程之前,我需要“杀死”(我不建议这样做)旧线程吗?

如果是,该如何解决?

2 个答案:

答案 0 :(得分:6)

  

一切正常

...可能是偶然的。

  

每次我需要调用扬声器类时,都需要创建一个新线程。实际上,我正在使用大量线程来进行后台工作并更新一些信息。

这是非常糟糕的做法。将线程视为工人。如果您不雇用工人来执行任务,请不要雇用线程来执行任务。

  

每次需要发送电子邮件时,这是一种不好的做法吗?

每次发送一封信然后解雇他们时,您会雇用一个新的管理员助手吗?

是的,这是一个不好的习惯。

  

在调用新线程之前,我需要“杀死”(我不建议这样做)旧线程吗?

为什么知道答案后又问一个问题? 切勿杀死线程。这是非常危险的。如果您每次有一封信要录入时都聘请新的管理员助理,那么当邮件进入邮箱时您会开枪射击吗?

CLR保证在中止线程时会保持其 不变量。 CLR不保证您中止线程时保持程序不变性。如果要中止线程,则应该中止每个线程并在紧急情况下关闭进程,因为您担心正在运行的线程会破坏用户数据。快速失败是在这种紧急情况下关闭的最安全方法。

如果您不处于紧急关闭状态,请不要杀死线程。

  

如果是,该如何解决?

  • 所有I / O任务-发送电子邮件,连接数据库,读取和写入文件,连接网络等-应该通过单线程异步完成。
  • 应该将所有与CPU绑定的任务放到一个单独的进程中,或者使用适当的高级任务调度技术(例如TPL)将其分配给工作线程。 不要管理自己的线程。让TPL管理您的线程,并仅为其分配CPU绑定任务。

答案 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");
相关问题