Как установить директиву асинхронной страницы динамически, чтобы асинхронные методы работали

Я пишу некоторый код Utility для отправки электронных писем Async.

var mailClient = new SmtpClient(smtpHost);
mailClient.SendCompleted += new SendCompletedEventHandler(mailClient_SendCompleted);

using (var mailMessage = new MailMessage())
{
    if (!((System.Web.UI.Page)HttpContext.Current.CurrentHandler).IsAsync)
    {
        // set to Async????
    }
    mailClient.SendAsync(mailMessage, new { EmailID });
}

Но я получаю ошибки, потому что мои Страницы не имеют Async="true" в директивах страницы.

вот стандартная ошибка, которую вы получаете:

"Asynchronous operations are not allowed in this context. Page starting an
asynchronous operation has to have the Async attribute set to true and an
asynchronous operation can only be started on a page prior to
PreRenderComplete event."

Я прочитал это: (последний абзац)

http://msdn.microsoft.com/en-us/magazine/cc163725.aspx

При создании асинхронных страниц следует помнить, что не следует запускать асинхронные операции, которые заимствуют из того же пула потоков, который использует ASP.NET. Например, вызов ThreadPool.QueueUserWorkItem в асинхронной точке страницы является контрпродуктивным, поскольку этот метод обращается из пула потоков, что приводит к чистому выигрышу в ноль потоков для обработки запросов. Напротив, вызов асинхронных методов, встроенных в Framework, таких методов, как HttpWebRequest.BeginGetResponse и SqlCommand.BeginExecuteReader, обычно считается безопасным, поскольку эти методы обычно используют порты завершения для реализации асинхронного поведения.

Вопросы:

1) Как я могу обновить страницу, чтобы она была асинхронной в моем коде C#?

2) Если я не могу, какова обратная сторона, заставляющая все мои страницы быть Async = true?

3) Есть ли еще лучший способ продвинуть мою задачу, не будучи "контрпродуктивным"?

1 ответ

Сколько разных страниц вам нужно для отправки почты?

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

Попробуйте создать одну (асинхронную) страницу для отправки электронной почты. Вы можете вызвать эту страницу с помощью Server.Transfer и перенаправить ее на нужную страницу после завершения.

Наконец, если вы отправляете так много электронных писем, что вы теряете производительность при синхронной отправке почты, то, возможно, вам следует создать службу Windows для отправки реальной электронной почты. Ваша страница ASP.NET поставит в очередь запрос к этой службе (через MSMQ или WCF), чтобы служба отправила электронное письмо.

Другие вопросы по тегам