Отправка массовых писем в фоновом режиме - Создать тему или использовать ThreadPool? - PullRequest
0 голосов
/ 09 ноября 2010

У меня есть приложение, в котором действие вызывает количество отправляемых писем.Количество электронных писем является переменным и может составлять от 10 до 1000 за действие .

Я не хочу, чтобы приложение зависало во время отправки электронных писем(таким образом раздражает пользователя) и хотел бы отправить их в фоновом режиме.

Я не использовал потоки в прошлом, поэтому мне нужна ваша помощь.Будете ли вы создавать потоки вручную или это хороший вариант для использования ThreadPool?Я хочу, чтобы эта задача имела низкий приоритет и использовала как можно меньше ресурсов, потому что я не против, даже если письмо опаздывает на 1 час.

Благодарим вас за помощь Marko

Ответы [ 5 ]

3 голосов
/ 09 ноября 2010

По правде говоря, многопоточность в ASP.NET не очень хорошая идея. Asp.net делает много утилизации ресурсов, когда запрос заканчивается и отправляет обратно пользователю. Поскольку вы не хотите, чтобы пользователь ждал, вы столкнетесь с этим сценарием, где объекты ASP.NET, которые вы считаете безопасными для использования, действительно расположены.

Лучшим вариантом является создание внешней службы (либо службы wcf, работающей в IIS, либо службы windows, для которой открыт интерфейс wcf), которую страница .net может вызывать асинхронно, и запускать этот запрос до завершения. Не беспокойтесь о многопоточности и т. Д. Он запускается в своем собственном процессе, и когда он завершается, он завершается. Так как вам не нужно рассказывать пользователю об этом, вам не придется беспокоиться о том, что он ответит. Таким образом, если вам нужно, чтобы какая-то другая страница использовала тот же интерфейс службы, она должна быть вызвана.

Страницы по началу работы с WCF:

http://bloggingabout.net/blogs/dennis/archive/2007/04/20/wcf-simple-example.aspx

http://msdn.microsoft.com/en-us/library/bb332338.aspx

http://www.c -sharpcorner.com / Статьи / ArticleListing.aspx? SectionID = 1 & SubSectionID = 192

Как начать использовать WCF / WPF?

1 голос
/ 10 ноября 2010

Вот еще одно предложение ... Если вы используете БД, создайте задачу (т.е. создайте таблицу, которая представляет задачу, которая должна быть выполнена), связанную с сообщениями, которые нужно отправить, и используйте Кварц.NET или аналогичный (вы также можете создать Службу Windows), который ищет незавершенные задачи и выполняет их (помечает их как выполненные в случае их успешного выполнения).

0 голосов
/ 10 ноября 2010

Вы можете использовать Задачи для порождения рабочего потока для обработки электронных писем.

Если это слишком сильно загружает ЦП, вы можете создать новый планировщик, уменьшающий параллелизм: http://msdn.microsoft.com/en-us/library/ee789351.aspx

static void StartMailTasks(string[] addresses)
{
    List<Task> tasks = new List<Task>();
    foreach (var address in addresses)
    {
        tasks.Add(Task.Factory.StartNew(Email, address));
    }

    Task.Factory.ContinueWhenAll(tasks.ToArray(), AllDone, TaskContinuationOptions.OnlyOnRanToCompletion);
    Task.Factory.ContinueWhenAny(tasks.ToArray(), ReportError, TaskContinuationOptions.OnlyOnFaulted);
}

static void AllDone(Task[] tasks)
{
    // All is well
}

static void ReportError(Task errorTask)
{
    // Log or report the error
}

static void Email(object state )
{
    // send the e-mail  
    // Can throw error, if needed
}
0 голосов
/ 09 ноября 2010

Вы можете просто использовать класс BackgroundWorker .

На связанной странице MSDN есть хороший пример с отчетами о ходе выполнения и возможностью отмены операции.

Изменить:
Отчеты о прогрессе и отмена могут не подходить в веб-приложении, но BackgroundWorker обрабатывает все грязные вещи с созданием потока для вас.

Edit2:
Если вы хотите отправлять много писем параллельно, вы можете посмотреть в Task Parallel Library .

0 голосов
/ 09 ноября 2010

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

...