我正在编写一些实用程序代码来发送电子邮件异步。
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“。
下面是您得到的标准错误:
“异步操作在此上下文中是不允许的。启动异步操作的页面必须将异步属性设置为true,而异步操作只能在PreRenderComplete事件之前在页面上启动。”
我读到:(最后一段)
http://msdn.microsoft.com/en-us/magazine/cc163725.aspx
在构建异步页面时要记住的最后一点是,不应该启动从ASP.NET使用的相同线程池中借用的异步操作。例如,在页的异步点调用ThreadPool.QueueUserWorkItem是适得其反的,因为该方法从线程池中提取,导致处理请求的净增益为零。相反,调用框架中内置的异步方法(例如HttpWebRequest.BeginGetResponse和SqlCommand.BeginExecuteReader )通常被认为是安全的,因为这些方法倾向于使用完成端口来实现异步行为。
问题:
1)如何在c#代码中将页面更新为异步?
2)如果我不能,强迫我的所有页面成为Async=true?的缺点是什么?
3)有没有更好的方式来执行我的任务而不产生“反效果”呢?
发布于 2009-07-02 08:07:23
您需要从几个不同的页面发送邮件?
另外,当您尝试发送异步时,您得到了什么错误?请编辑您的问题以包含整个异常。
考虑创建一个发送电子邮件的单一(异步)页面。您可以使用Server.Transfer调用该页面,并在完成后将其重定向回所需的页面。
最后,如果您发送的电子邮件太多,以致在同步发送邮件时性能下降,那么也许您应该创建一个Windows服务来发送实际的电子邮件。您的ASP.NET页面会将请求排队到此服务(通过MSMQ或WCF),让服务发送电子邮件。
https://stackoverflow.com/questions/1074976
复制相似问题