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

本文关键字:多线程 电子邮件 用于 | 更新日期: 2023-09-27 18:27:52

我有一个包含电子邮件列表名称的列表视图(导入时添加路径和名称)。我有另一个smtp服务器的列表视图,它有5列:ip、端口、用户、传递、类型(normal、ssl、tls)用于进度条目的的后台工作人员。

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

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

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

我花了一个多星期的时间试图找到解决方案,但我做不到。我看到这里有很多专家,也许你可以帮助一个n00b用户。

如何使用从listView2.CheckedItems轮换的smtp服务器并使用20-30个线程从每个listView1.CheckedItemss发送电子邮件非常感谢。

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

首先,您应该使用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);
        }
    }
}