【问题标题】:How to set Async Page Directive Dynamically so Async Methods work如何动态设置异步页面指令以便异步方法工作
【发布时间】:2009-07-02 15:12:36
【问题描述】:

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

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 在 页面的异步点是 适得其反,因为这种方法 从线程池中提取,导致 在零线程的净增益 处理请求。相比之下, 调用构建的异步方法 进入框架,方法如 HttpWebRequest.BeginGetResponse 和 SqlCommand.BeginExecuteReader,是 一般认为是安全的 因为这些方法倾向于使用 要实施的完成端口 异步行为。

问题:

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

2) 如果我不能强制我的所有页面都为 Async=true 有什么不好的?

3) 有没有更好的方法来处理我的任务而不会“适得其反”?

【问题讨论】:

    标签: c# asp.net asynchronous page-directives


    【解决方案1】:

    您需要从多少个不同的页面发送邮件?

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

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

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

    【讨论】:

    • 我要进行异步调用的原因是从 Web 服务器到邮件服务器的连接时间可能/很慢......我没有发送数千封电子邮件......
    • 那么你不应该这样做。让服务器完成这项工作,打开一次连接,然后永远发送电子邮件。
    • 我从许多页面发送电子邮件,这就是我将功能放入实用程序类的原因。我也无权访问邮件服务器,因此在其上部署 wcf 应用程序不会运行。(虽然会很有趣)
    • 不,您不需要将 WCF 应用程序部署到邮件服务器。您可以将其部署到当前运行您的 Web 应用程序的同一台服务器上。
    • 可能会使问题过于复杂...我希望有一种简单的方法来解决这个问题...而不是通过添加另一个应用程序,无论如何我都不会获得批准花时间在这上面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多