Когда пользователь регистрируется на моем веб-сайте, я не понимаю, почему мне нужно заставить его "ждать", чтобы smtp прошел, чтобы он получил адрес электронной почты активации.
Я решил, что хочу запустить этот код асинхронно, и это было приключение.
Предположим, что у меня есть метод, например:
private void SendTheMail() { // Stuff }
Мой первый, хотя.. был потоковым. Я сделал это:
Emailer mailer = new Emailer();
Thread emailThread = new Thread(() => mailer.SendTheMail());
emailThread.Start();
Это работает... пока я не решил проверить его на возможности обработки ошибок. Я намеренно сломал адрес сервера SMTP в своем web.config и попробовал его. Страшный результат заключался в том, что IIS в основном BARFED с необработанной ошибкой исключения на w3wp.exe(это была ошибка Windows! Насколько экстремальна...) ELMAH (мой регистратор ошибок) НЕ поймал ее И IIS был перезапущен, поэтому любой, кто на сайте их сеанс стирается. Полностью неприемлемый результат!
Моя следующая мысль заключалась в том, чтобы провести некоторое исследование асинхронных делегатов. Кажется, что это работает лучше, потому что исключения обрабатываются внутри делегата asynch (в отличие от примера потока выше). Тем не менее, я обеспокоен, если я делаю это неправильно или, возможно, я вызываю утечку памяти.
Вот что я делаю:
Emailer mailer = new Emailer();
AsyncMethodCaller caller = new AsyncMethodCaller(mailer.SendMailInSeperateThread);
caller.BeginInvoke(message, email.EmailId, null, null);
// Never EndInvoke...
Я делаю это правильно?