2012-03-15 80 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