Должен ли каждый из уведомлений о доставке находиться в отдельном потоке?
Если бы вы должны были инкапсулировать логику поиска и проверки электронной почты в какую-то службу, которую вызывал поток, тот факт, что было несколько уведомлений о доставкеможет быть скрыт от потока планирования.Например, IEmailService
может иметь следующий контракт:
public interface IEmailService
{
void SendEmailsToValidAddresses();
}
, и реализация может выглядеть примерно так:
public class MultipleSourcesEmailService : IEmailService
{
private IEnumerable<IDatabaseSource> databases;
public EmailService(params IDatabaseSource[] sources)
{
databases = new List<IDatabaseSource>(sources);
}
public void SendEmailsToValidAddresses()
{
foreach(var database in databases)
{
var emailAddresses = database.SelectAllEmailAddresses();
ValidateAndSendEmailsTo(emailAddresses);
}
}
public void ValidateAndSendEmailsTo(IEnumerable<string> emailAddresses)
{
// Perform appropriate logic
...
}
}
Таким образом, ваша логика таймера может оставатьсято же самое и в одном потоке, в то время как проблема отправки электронных писем разделена на IEmailService
.Это также означает, что вы могли бы реализовать SingleSourceEmailService
и MultipleSourceEmailService
и поменять несколько источников, когда вы завершите код, и потребителю службы никогда не потребуется знать.
Конечно, EmailService asреализованный выше будет отправлять SendEmails из нескольких источников последовательно - если вам нужно, чтобы он работал параллельно, вы можете изменить EmailService для запуска нового потока для каждого из имеющихся у вас DSN, вы можете даже назвать его: MultiThreadedMultipleSourceEmailService
, но какПотребитель IEmailService ваш график никогда не будет знать разницу.