c#中foreach循环内的线程

ACP*_*ACP 6 c# asp.net multithreading

海家伙,

我有以下代码将不同的邮件发送到我的asp.net Web应用程序中的不同用户

foreach (DataRow dataRow in dataTable.Rows) 
{
   sendMails();
}
public void sendMails()
{
 //mail code
}
Run Code Online (Sandbox Code Playgroud)

现在我想在foreach循环中使用线程,但我不知道结果是什么,因为如果我开始'n'线程池中发生什么线程...考虑我的数据表包含1000行,

是否可以同时运行1000个线程?

foreach (DataRow dataRow in dataTable.Rows) 
{
    ThreadStart ts1 = new ThreadStart(sendMails);
    Thread thread1 = new Thread(ts1);
    thread1.Start();
}

public void sendMails()
{
   //mail code
}
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 14

启动一个可以完成发送所有邮件的线程:

new Thread(() => {
    foreach (DataRow dataRow in dataTable.Rows) 
    {
        sendMails();
    }
}).Start();
Run Code Online (Sandbox Code Playgroud)

  • 我不认为我会使用线程池线程来完成这样一个可能长期存在的工作.在这种情况下,启动新线程的开销可能远远小于发送所有邮件的开销.线程池更适合于短期运行,频繁调度的作业.要么会工作. (6认同)
  • 考虑将此作业排队到ThreadPool而不是手动实例化线程. (4认同)

Jon*_*eet 5

使用你已经获得的代码,线程池不会发生任何事情 - 你将在线程池之外完全创建新线程.

您确定要为每封邮件使用一个帖子 - 甚至是多个线程吗?我想你会受到与本地SMTP服务器连接的限制,启动多个线程对你没有帮助.

如果使用线程的目的是能够将页面返回给用户说"是的,我现在正在发送邮件",那么启动单个线程以在后台发送所有内容(根据Darin的建议)更为明智.另一方面,它确实意味着如果该过程因任何原因而停止,您最终可能只发送了一半.另一种选择(如Charlie所建议的)是使用排队系统(例如文件,数据库或MSMQ).这样你就可以阻止,直到你排队所有的邮件,这意味着当你回到用户时你可以确信数据是"安全的" - 但是你可以在后台发送实际的邮件,并提供可能的服务.更健壮.