мульти темы для отправки писем - PullRequest
1 голос
/ 16 марта 2012

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

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

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

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

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

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

1 Ответ

1 голос
/ 16 марта 2012

Прежде всего, вы должны использовать 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);
        }
    }
}
...