用于发送电子邮件的多线程
本文关键字:多线程 电子邮件 用于 | 更新日期: 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);
}
}
}