2012-10-17 17 views
0

我試圖通過在退出頁面之前發送電子郵件 來避免等待時間。發送電子郵件,無需等待完成執行的操作

頁/應用程序退出如下之前做的一系列動作:

  1. 數據庫交互
  2. 發送電子郵件(更新一有關的事務管理器)
  3. 退出頁/應用。後面的功能

代碼:

ExecEntryOnTbl(SQL);// <-- update/insert to database 
    sendMailNote(action);// <-- send mail with notification of update 

    exitTC(action, custid);<-- exit page. 

    done via javascript : 
    window.location.href = "someOtherPage.aspx" 
    from code behind via 
    RegisterClientScriptBlock(...) 

我想解決這個問題:

我怎樣才能避免等待sendMailNote()完成 以下exitTC()可能被執行之前。那可能嗎 ?

  • 更新電子郵件類/方法

    public static class mail 
    { 
        public static string aReciver, bSubject, cBody; 
        public static void sendMailNoteExc() 
        { 
    
         string SmtpServer = "smtp.gmail.com"; 
         int port = 111; 
         string sender = "[email protected]"; 
         string ReCiver = aReciver; 
         string Subject = bSubject; 
         string Body = cBody; 
         string account = "[email protected]"; 
         string Pass = "a123456"; 
         Send(SmtpServer, port, account, Pass, sender, ReCiver, Subject, Body); 
    
        } 
        public static void Send(string smtpServer,int Port,string Account, string PassWord, string From, string To, string Subject, string Body) 
        { 
    
         MailMessage mail = new MailMessage(); 
         SmtpClient SmtpServer = new SmtpClient(smtpServer); 
    
         mail.From = new MailAddress(From); 
         mail.To.Add(To); 
         mail.Subject = Subject; 
         mail.Body = Body; 
    
    
         SmtpServer.Port = Port; 
         SmtpServer.Credentials = new System.Net.NetworkCredential(Account, PassWord); 
         SmtpServer.EnableSsl = true; 
    
         SmtpServer.Send(mail); 
    
    
        } 
    } 
    

回答

3

只要你使用的是C#4.0中,你可以採取的Task Parallel Library優勢,並在後臺線程這樣運行了sendMailNote(action)

Task.Factory.StartNew(() => sendMailNote(action)); 

只要確保你添加代碼以處理任何異常發送過程中出現電子郵件。然而,更好的解決方案是從用戶界面代碼中完全刪除此邏輯,並在後臺任務(如Windows服務或雲工作者角色)中執行此邏輯。

+0

你有沒有看到最後回答'@Ehsan Aleem Avee'是否有必要指定任務屬性以便它們按照指定的方式工作? – LoneXcoder

+0

或者這是完全不同的類/方法,他正在使用? – LoneXcoder

+0

這兩個答案背後的想法是相同的,但他使用更低級別的API來使用後臺線程。如果您能夠使用TPL,那麼我建議您這樣做,因爲它使用起來更容易,並且使用.NET Framework線程池而不是創建新線程的速度更快。 –

0

你可以堅持的電子郵件信息到數據庫,並有實際發送郵件後臺cron作業。

+0

你可以舉一個簡單的例子,你如何做到這一點?我會告訴你我正在使用的真正的發送郵件功能,聽起來很有趣(更新後) – LoneXcoder

2

在另一個線程中執行此操作。因此您的主線程不會等待電子郵件發送。

ExecEntryOnTbl(SQL);// <-- update/insert to database 

ThreadStart sendMail = delegate() 
{ 
    sendMailNote(action) 
}; 

Thread thread = new Thread(sendMail); 
thread.IsBackground = true; 
thread.Start(); 

exitTC(action, custid);<-- exit page. 

done via javascript : 
window.location.href = "someOtherPage.aspx" 
from code behind via 
RegisterClientScriptBlock(...) 
+0

謝謝,是否有任何區別,我已經接受爲正確的答案(它只是工作)你的代碼嘗試設置線程屬性...等,或者你沒有考慮到使用可用的'任務並行'時使用c #4.0 – LoneXcoder

+0

我不瞭解Task.Factory.StartNew功能。但我認爲這也創造了一條新線索,以異樣的方式完成工作。 –

相關問題