2013-02-07 45 views
0

羣發郵件我呼籲線程母版頁頁面加載,並呼籲電子郵件功能,併爲:發送背景

Page_load() 
{ 
    CreatingThread(); 
} 

protected void CreatingThread() 
{ 
    Thread tSendMails; 
    tSendMails = new System.Threading.Thread(delegate() { EmailQueueSettings(); }); 
    tSendMails.IsBackground = true; 
    tSendMails.Start(); 
} 

protected void EmailQueueSettings() 
{ 
    // Function to get emails which are not sent ; 
    // looping it and sending it one by one 
    // Function to send mails 
    // Updating the status after mail is sent 
} 

郵件會但同一用戶多次的郵件發送給他們。

當下一次加載頁面時是否可以分配不同的線程和不同的郵件?

+0

重新閱讀你的文章並修改 – 2013-02-07 12:52:17

+1

你爲什麼要把它放在你的母版頁的Page_Load中,你是否希望每當有人打電話給使用母版頁的頁面時,它都會嘗試發送這些電子郵件? – Tanner

+1

我會使用Visual Studio調試器來找出爲什麼你多次發送電子郵件到同一個地址。 –

回答

1

其實,重新讀你的要求和意見。我想我誤解了你的要求。我假設你希望這種方式能夠在頁面加載時運行,並以不同的線程運行於用戶所在的位置。但是,你想要什麼東西能夠持續運行在Web應用程序的後面,對嗎?

通常,我會做的是在後臺有一個控制檯應用程序。但是你可以在global.asax Application_Start方法中做一些事情。

void Application_Start(object sender, EventArgs e) 
{ 
    Task beginSendEmailTask = new Task(SendEmailRunningTask); 
    beginSendEmailTask.Start(); 
} 

void SendEmailRunningTask() 
{ 
    while (true) 
    { 
     Thread.Sleep(300000); // 5minutes 
     MailMessage[] emails = GetEmailsToSend(); 
     SmtpClient client = new SmtpClient(); // Configure this 

     foreach (MailMessage email in emails) 
     { 
      client.Send(email); 
      // Mark email in your database/application as sent. 
     } 
    } 
} 

不要忘記將電子郵件標記爲已發送的郵件,以便存儲它們。這可能是你爲什麼多次發送它們的原因。這也可能是因爲它正在爲每個主頁加載運行。

編輯:解釋


網站開始 任務創建一個新線程 任務進入循環

任務等待5分鐘
GetEmailsToSend()發現前50出的100封郵件發送。
迭代併發送該電子郵件

任務等待5分鐘
GetEmailsToSend()查找下一個50選自100的電子郵件發送。
迭代併發送該電子郵件

任務等待5分鐘
GetEmailsToSend()發現沒有電子郵件

任務等待5分鐘
GetEmailsToSend()發現2名新的電子郵件
迭代併發送該電子郵件

+0

Parallel.ForEach()我沒有得到它。 – bs25

+0

每隔5分鐘運行一次這個函數是否可以在asp.net應用程序中使用? – bs25

+0

你在寫什麼框架?我相信它使用.NET4。是的,你可以在一個控制檯應用程序的某個5分鐘循環中完成。 –