2012-03-15 63 views
1

我有一个列表视图与电子邮件列表的名称(在导入时,它添加的路径和名称)。 我有另一个列表视图与5列smtp服务器:ip,端口,用户,传递,类型(普通,ssl,tls) 背景工作进度栏的目的。多线程发送电子邮件

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

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

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

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

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

+2

投票关闭:当问题本身看起来合理,有效的答案很可能需要解释如何质量-发电子邮件。请考虑将问题分成可以更一般性回答的块(即“如何从3中随机选择一个字符串”而不是“需要选择随机SMTP服务器”)。 – 2012-03-15 21:01:58

+0

对我而言,您想使用ActiveTrail等批量电子邮件服务。 – zmbq 2012-03-15 21:14:59

回答

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); 
     } 
    } 
} 
+0

非常感谢。我会测试这个,希望我能够实现你的想法。 – 2012-03-15 21:59:25

+0

我添加了你的函数,我得到以下错误:跨线程操作无效:控制'listView2'从一个线程访问,而不是它创建的线程。你能帮我吗? – 2012-03-16 12:20:13

+0

你想修改线程池中的listView2吗? – Tudor 2012-03-16 14:59:51