Поскольку вы используете .Net 4.0, вы можете использовать несколько новых конструкций, доступных здесь, вы можете заменить это:
foreach(string s in liste)
new Thread(x => SendMail(s)).Start();
С Parallel.ForEach
:
Parallel.ForEach(liste, SendMail);
Или не подходит для данного случая, но работает расширение .ForAll()
:
liste.AsParallel().ForAll(SendMail);
Кто-то поправляет меня здесь, но я думаю, что происходит, что если поток занимает любое время для запуска, он ссылается на s
из foreach, который не принадлежать к нему. Поток передает значение s
в SendMain, , но это получает это значение, когда оно к нему готово ... и это может быть после того, как цикл foreach
уже перешел, что означает, что строка, на которую указывает s
, изменилась.
Например: если запускаются 2 потока, один медленный и один быстрый ... первый медленный может получить s
от более поздней итерации foreach()
, а более быстрый может получить правильный s
для токовая петля. Это означает, что 2 потока получили одинаковую ссылку s
, и первый поток скопировал неправильное значение для передачи в SendMail()
.