用于发送电子邮件的多线程

时间:2012-03-15 20:38:38

标签: c# multithreading smtp threadpool sendmail

我有一个列表视图,其中包含电子邮件列表的名称(在导入时,它会添加路径和名称)。 我有另一个带有5列smtp服务器的列表视图:ip,port,user,pass,type(normal,ssl,tls) 进度条目的背景工作者。

int cnt = this.listView1.CheckedItems.Count;//email lists
            for (int i = 0; i < cnt; i++)
            {
                startsend();
            }

因此,对于listView1中的每个电子邮件列表,它都将执行此功能。

但我不知道如何使该功能使用20-30个线程,并且还使用listView2(checkitems)中的所有smtp服务器(非随机)来发送电子邮件。 我只有3个smtp服务器,但我仍然想使用20个线程。

我试图找到一个解决方案超过一个星期,但我不能。我看到这里有很多专家,也许你可以帮助一个n00b用户。

如何使用从listView2.CheckedItems旋转并使用20-30个线程的smtp服务器从每个listView1.CheckedItems发送电子邮件? 谢谢!

1 个答案:

答案 0 :(得分:1)

首先,您应该使用foreach执行此任务,它更具可读性。首先,您可以遍历服务器,然后通过电子邮件列表和内部循环并行发送邮件:

ThreadPool.SetMinThreads(20, 20);
int activeWorkers = 0;
object signal = new object();

foreach(/* server in listView2 */)
{
    foreach(/* email in listView1 */)
    {
        lock(signal) ++activeWorkers; // keep track of active workers

        ThreadPool.QueueUserWorkItem(
            o =>
            {
                string email = (string)o;
                startsend(server, email);                   

                lock(signal) // signal termination
                {
                   --activeWorkers;
                   Monitor.Pulse(signal);                    
                }
            }, email);

        lock(signal) 
        {
           while(activeWorkers > 0) // improvised barrier
               Monitor.Wait(signal);
        }
    }
}