2013-04-08 75 views
0

在網頁上,我啓動並行進程來執行長時間運行的任務,然後發送電子郵件以跟蹤其「輸出」。 但是線程有時似乎在發送電子郵件之前就結束了(電子郵件是我唯一的線索),我認爲這可能與超時有關。Asp.Net:executionTimeout +並行線程

下面的代碼:

var thread = new Thread(() => 
{ 
    var cli = Factory.GetClient(callBack); 
    FedDBService.ReturnMessage msg; 
    try 
    { 
     msg = cli.SendFedCards(xmls.ToArray()); 
    } 
    catch (Exception exe) 
    { 
     msg = new FedDBService.ReturnMessage(); 
     msg.Error = exe.Message; 
    } 
    finally 
    { 
     cli.Close(); 
     completion.Finished = true; 
    } 
    message = String.Format(@"{0}Ended: {1: HH:mm} {2} {3}", message, DateTime.Now, 
       msg.Error.Trim(' ', '\n', '\r', '\t') == "" ? 
            "Withouth errors" : "With errors:" 
       , msg.Error); 
    try 
    { 
     golf.classes.Mailing.Mail.sendMail(Club.ClubEmail, email, null, 
     "***@***.com", message, "**Subject**", false); 
     // this method works right 
    } 
    finally 
    { 
     Thread.Sleep(5 * 60 * 1000); 
     RemoveCompletion(guid); 
    } 
}); 
thread.Start(); 

你認爲這是涉及到一些超時?我可以在不允許通常的請求永久運行的情況下更改它嗎?

+0

我看到兩個選項。線程正常結束或拋出異常。如果拋出異常,執行將不會繼續,並且您的消息將不會被髮送。如果執行完成,也許這是SMTP服務器的配置問題等等,我會先在'catch'塊中做一些類型的日誌記錄。 – 2013-04-08 10:51:11

回答

1

您不應該在網絡應用程序中啓動後臺工作 - 如果應用程序池被回收,您的後臺工作將會被極端偏見中止。

菲爾哈克寫了一篇博客有關此主題在這裏:

The Dangers of Implementing Recurring Background Tasks In ASP.NET

推薦的解決方案是對這項工作傳遞給一個單獨的Windows服務。