C# 如何动态设置异步页面指令以使异步方法工作

C# 如何动态设置异步页面指令以使异步方法工作,c#,asp.net,asynchronous,page-directives,C#,Asp.net,Asynchronous,Page Directives,我正在写一些实用程序代码来异步发送电子邮件 var mailClient = new SmtpClient(smtpHost); mailClient.SendCompleted += new SendCompletedEventHandler(mailClient_SendCompleted); using (var mailMessage = new MailMessage()) { if (!((System.Web.UI.Page)HttpContext.Current.Cur

我正在写一些实用程序代码来异步发送电子邮件

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”

以下是您得到的标准错误:

我读到:(最后一段)

最后一点要记住,因为你 构建异步页面是您需要的 不应启动异步 从同一系统借用的操作 ASP.NET使用的线程池。对于 例如,打电话 位于的ThreadPool.QueueUserWorkItem 页面的异步点是 因为这种方法会适得其反 从线程池中提取,生成 在0线程的净增益中 处理请求。相比之下 调用构建的异步方法 进入框架,方法如 HttpWebRequest.BeginGetResponse和 SqlCommand.BeginExecuteReader,是 一般认为是安全的 因为这些方法倾向于使用 要实现的完成端口 异步行为

问题:

1)如何在我的c代码中将页面更新为异步

2)如果我做不到,强制我的所有页面都异步=真有什么不好的地方吗?


3)有没有更好的方法来处理我的任务而不产生“反效果”

你需要从多少不同的页面发送邮件

另外,当您尝试发送async时出现了什么错误?请编辑您的问题以包含整个异常

考虑创建一个单独的(异步)页面来发送电子邮件。您可以使用Server.Transfer调用该页面,并在完成后将其重定向回所需页面


最后,如果您发送的电子邮件太多,导致同步发送邮件时性能下降,那么您可能应该创建一个Windows服务来发送实际的电子邮件。您的ASP.NET页面将对此服务的请求(通过MSMQ或WCF)进行排队,以使该服务发送电子邮件。

我希望使调用异步的原因是从web服务器到邮件服务器的连接时间可能/很慢。。。我不会发送成千上万的电子邮件…那么你不应该这样做。让一个服务器完成这项工作,打开一次连接,然后永远发送电子邮件。我从许多页面发送电子邮件,这就是为什么我将此功能放入实用程序类。我也没有访问邮件服务器的权限,因此在邮件服务器上部署wcf应用程序将无法正常运行。(虽然会很有趣)不,您不需要将wcf应用程序部署到邮件服务器。您会将其部署到当前运行web应用程序的同一服务器上。可能会使问题过于复杂。。。我希望有一个简单的方法来处理这个。。。不是通过添加另一个应用程序,我无论如何也不会得到在上面花费时间的批准。
"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."