2012-03-15 4 views
1

У меня есть список с именами списков электронной почты (при импорте он добавляет путь и имя). У меня есть другой список с серверами smtp с 5 столбцами: ip, port, user, pass, type (normal, ssl, tls) фоном для целей выполнения.несколько потоков для отправки писем

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

поэтому для каждого списка писем в спискеView1 он будет выполнять эту функцию.

но я не знаю, как заставить функцию использовать потоки 20-30, а также использовать все SMTP-серверы (не случайные), которые у меня есть в listView2 (checkeditems), чтобы отправить электронные письма. У меня всего 3 сервера smtp, но я все еще хочу использовать 20 потоков.

Я попытался найти решение для этого более недели, но я не мог. Я видел, что здесь много экспертов, и, возможно, вы можете помочь пользователю n00b.

Как я могу отправить электронные письма из каждого спискаView1.CheckedItems, используя серверы smtp, которые повернуты из спискаView2.CheckedItems, а также используя 20-30 потоков? Спасибо!

+2

голосования, чтобы закрыть: в то время как сам вопрос выглядит разумным, действительные ответам, скорее всего, нужно объяснить, как массу -Отправить письма. Пожалуйста, подумайте о том, чтобы разделить свой вопрос на куски, на которые можно ответить более общим образом (например, «как случайным образом выбрать одну строку из 3» вместо «нужно выбрать случайный SMTP-сервер»). –

+0

Кажется, вы хотите использовать массовую службу электронной почты, такую ​​как ActiveTrail. – zmbq

ответ

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

большое спасибо. Я испытаю это и надеюсь, что смогу реализовать свою идею. –

+0

Я добавил вашу функцию, и я получаю следующую ошибку: Неверная операция перекрестного потока: Control 'listView2' обращается из потока, отличного от потока, на котором он был создан. Можете ли вы мне помочь? –

+0

Вы пытаетесь изменить 'listView2' из threadpool? – Tudor