[英]Why does sending many emails asynchronously block the site? ( using Action.BeginInvoke )
我創建了一個頁面,向我們的客戶發送成千上萬的電子郵件,幾乎是8K電子郵件。 發送過程需要花費數小時,但是過了一會兒,除了靜態文件(圖像等)之外,我無法訪問托管該頁面的站點中的任何頁面(等待...)。
使用:IIS 6和.Net 4.0
碼:
public static bool Send(MailSettings settings, Action<string, string[], bool> Sent = null)
{
System.Net.Mail.SmtpClient client;
...
foreach(){
try{ client.Send(message);}catch{...client.Dispose();...}
Sent.BeginInvoke(stringValue, stringArray, boolValue, null, null);
if(count++>N){
count=1;
System.Threading.Thread.Sleep(1000);
}
}
...
}
public void SentComplete(string email, string[] value, bool isSent)
{
....//DB logging
}
問題:
IIS 6.0對同一網站的線程數是否有限制?
如果我的代碼引起任何性能問題,您有任何想法嗎? 我使用Action是否正確?
此代碼有很多錯誤:
如果最終由於某種原因而被阻止,您也可能被會話阻止(如果您有一個會話)...如果您打開其他瀏覽器,是否可以正常工作?
您正在觸發一大堆要在線程池中執行的動作。 線程池將創建一個最大數量的線程,之后,發送到該池的工作項只會排隊。 由於您要用大量的操作來充斥線程池,因此您就無法避免線程池有機會來處理由ASP.NET添加的用於處理頁面的項目。 由於靜態項目不需要將工作推送到線程池,因此可以為這些項目提供服務。
您不應該並行發射那么多項目。 您應該將並行度限制在一個相當小的固定值上。 讓您啟動的少數幾個項目處理大量的操作,以便線程池中的線程也可以進行其他操作。
我們定期發送10000個客戶電子郵件。 我將電子郵件的所有詳細信息存儲在數據庫中,然后調用Web服務發送它們。 這只是對它們的挑戰,對其他都沒有影響。 在每次發送Send的調用之間,我確實使線程處於睡眠狀態(在Web服務中),持續了100毫秒。如果不執行此操作,則會觸發大量電子郵件,似乎使我們的郵件服務器不知所措,並且發生了一些奇怪的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.