我有一个列表视图,其中包含电子邮件列表的名称(在导入时,它会添加路径和名称)。 我有另一个带有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发送电子邮件? 谢谢!
答案 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);
}
}
}