2015-10-18 83 views
3

我在.net 4.5中有一個C#wcf Windows服務,每天向大約1000個不同的客戶發送電子郵件。我想嘗試使用我在這裏找到的這段代碼發送電子郵件異步,但我應該如何包裝它以捕捉異常?如何在SendMailAsync方法中捕獲異常

public async Task SendAsync(string subject, string body, string recipient) 
{ 
    var mailMessage = new MailMessage("[email protected]", recipient, subject, body); 
    mailMessage.IsBodyHtml = true; 

    using(var client = new SmtpClient("mysmtpserver")) 
    { 
     try 
     { 
      await client.SendMailAsync(mailMessage); 
     } 
     catch (Exception ex) 
     { 
      // Log here 
     } 
    } 
} 

我在等待無效的電子郵件地址和服務器超時。

我是否應該在嘗試抓包中等待呼叫?不知道這會工作。

另外哪裏是放置通過所有郵件地址的foreach循環的最佳位置?

謝謝。

+0

超時是難免的,但無效的電子郵件應之前發送郵件進行檢查。不要依賴正常執行流程的異常。 –

+0

取決於您想要的控制流程。你希望它在第一次失敗時終止嗎? – Aron

+0

只要登錄異常並轉到下一個收件人即可。 –

回答

3

我是不是應該試着將這個await Call包裝起來?不知道這會工作。

是的,await傳播異常,這將工作。當然,在郵件離開你的服務器之後,你會發生許多郵件傳遞失敗,並且你會得到反彈甚至一無所獲。無論您如何發送郵件,這都是無法檢測到的。

還有哪裏是放置通過所有郵件地址的foreach循環的最佳位置?

不確定你的意思。圍繞對SendAsync的呼叫放置循環?還有什麼地方可以去?我可能誤解了。

+0

謝謝。我的意思是,如果我可以發送一個收件人數組,並簡單地重用方法內的smtp客戶端。 –

+0

你可以做到這一點,但我認爲當客戶失去聯繫或其他事情時,客戶可能會變得「虛弱」。 – usr

1

我知道這是一箇舊帖子,它已被回覆,但我能夠使用此方法捕獲await調用。

public async Task <JsonResult> UserDelete(string username) { 
 
    // return obj 
 
    MFFCommon retval = new MFFCommon(); 
 

 
    // get user 
 
    var user = UserManager.FindByName(username); 
 
    
 
    // starts a task 
 
    Task removeUserFromAgency = await Task.Factory.StartNew(async() => { 
 
    await removeUserFromCurrentAgency(user); 
 
    }); 
 
    
 
    // optional, but this will wait 3 sec before checking if it is complete. 
 
    removeUserFromAgency.Wait(3000); 
 
    
 
    
 
    if (removeUserFromAgency.IsCompleted) { 
 
    retval.taskResponse = "True"; 
 
    retval.taskError = null; 
 
    return Json(retval, JsonRequestBehavior.AllowGet); 
 
    } else { 
 
    // This is where the exception is at. 
 
    retval.taskResponse = "False"; 
 
    retval.taskError = removeUserFromAgency.Exception.Message; 
 
    return Json(retval, JsonRequestBehavior.AllowGet); 
 
    } 
 
}