簡體   English   中英

為什么發送許多電子郵件異步阻止站點? (使用Action.BeginInvoke)

[英]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是否正確?

此代碼有很多錯誤:

  1. 您的嘗試捕獲塊很奇怪。 您正在一次迭代中放置一個對象,但其他對象也可以使用它。 嘗試改為使用塊。
  2. asp.net請求有一個最大的執行時間。
  3. 不要將線程睡眠放在asp.net中!
  4. 是的,asp.net池中有最大線程數

如果最終由於某種原因而被阻止,您也可能被會話阻止(如果您有一個會話)...如果您打開其他瀏覽器,是否可以正常工作?

您正在觸發一大堆要在線程池中執行的動作。 線程池將創建一個最大數量的線程,之后,發送到該池的工作項只會排隊。 由於您要用大量的操作來充斥線程池,因此您就無法避免線程池有機會來處理由ASP.NET添加的用於處理頁面的項目。 由於靜態項目不需要將工作推送到線程池,因此可以為這些項目提供服務。

您不應該並行發射那么多項目。 您應該將並行度限制在一個相當小的固定值上。 讓您啟動的少數幾個項目處理大量的操作,以便線程池中的線程也可以進行其他操作。

我們定期發送10000個客戶電子郵件。 我將電子郵件的所有詳細信息存儲在數據庫中,然后調用Web服務發送它們。 這只是對它們的挑戰,對其他都沒有影響。 在每次發送Send的調用之間,我確實使線程處於睡眠狀態(在Web服務中),持續了100毫秒。如果不執行此操作,則會觸發大量電子郵件,似乎使我們的郵件服務器不知所措,並且發生了一些奇怪的事情。

暫無
暫無

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

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