簡體   English   中英

如何動態設置異步頁面指令,以便異步方法起作用

[英]How to set Async Page Directive Dynamically so Async Methods work

我正在編寫一些實用程序代碼來發送異步電子郵件。

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/zh-CN/magazine/cc163725.aspx

構建異步頁面時要記住的最后一點是,不應啟動借用ASP.NET使用的同一線程池的異步操作。 例如,在頁面的異步點調用ThreadPool.QueueUserWorkItem是適得其反的,因為該方法從線程池中提取,導致用於處理請求的凈線程數為零。 相比之下,通常認為調用框架中內置的異步方法(例如HttpWebRequest.BeginGetResponse和SqlCommand.BeginExecuteReader)是安全的,因為這些方法傾向於使用完成端口來實現異步行為。

問題:

1)如何在我的C#代碼中將頁面更新為異步?

2)如果不能將所有頁面強制設置為Async = true,會有什么不利之處?

3)有沒有更好的方法來線程我的任務而又不會“適得其反”?

您需要從幾個不同的頁面發送郵件?

另外,嘗試發送異步消息時遇到什么錯誤? 請編輯您的問題以包含整個例外。

考慮創建一個(異步)頁面來發送電子郵件。 您可以使用Server.Transfer調用該頁面,並在完成后將其重定向回所需的頁面。

最后,如果您發送的電子郵件太多,則在同步發送郵件時會失去性能,那么也許您應該創建Windows服務來發送實際的電子郵件。 您的ASP.NET頁將對該服務(通過MSMQ或WCF)的請求進行排隊,以使該服務發送電子郵件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM