2013-02-28 93 views
4

來捕獲異常我有幾個方法已經同步發送電子郵件。有沒有辦法使用System.Net.Mail.SendAsync()

如果電子郵件失敗,我用這個相當標準代碼:

static void CheckExceptionAndResend(SmtpFailedRecipientsException ex, SmtpClient client, MailMessage message) 
    { 
     for (int i = 0; i < ex.InnerExceptions.Length -1; i++) 
     { 
      var status = ex.InnerExceptions[i].StatusCode; 

      if (status == SmtpStatusCode.MailboxBusy || 
       status == SmtpStatusCode.MailboxUnavailable || 
       status == SmtpStatusCode.TransactionFailed) 
      { 
       System.Threading.Thread.Sleep(3000); 
       client.Send(message); 
      } 
     } 
    } 

不過,我試圖達到使用SendAsync()基本相同。這是我到目前爲止的代碼:

public static void SendAsync(this MailMessage message) 
    { 
     message.ThrowNull("message"); 

     var client = new SmtpClient(); 

     // Set the methods that is called once the event ends 
     client.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback); 

     // Unique identifier for this send operation 
     string userState = Guid.NewGuid().ToString(); 

     client.SendAsync(message, userState); 

     // Clean up 
     message.Dispose(); 
    } 

    static void SendCompletedCallback(object sender, AsyncCompletedEventArgs e) 
    { 
     // Get the unique identifier for this operation. 
     String token = (string)e.UserState; 

     if (e.Error.IsNotNull()) 
     { 
      // Do somtheing 
     } 
    } 

的問題是使用令牌和/或e.Error我怎麼得到的異常,這樣我可以做出的StatusCode必要的檢查,然後重新發送?

我一直在谷歌搜索整個下午,但沒有發現任何積極的。

任何意見讚賞。

+1

繼承人關於異步異常處理的帖子 - 可能會暗示發生了什麼! http://stackoverflow.com/questions/5383310/catch-an-exception-thrown-by-an-async-method – bUKaneer 2013-02-28 15:14:44

+0

'e.Error' *是例外。如果已分配,則出現問題,然後您可以調查異常屬性。 – James 2013-02-28 15:17:16

回答

4

e.Error已經在發送電子郵件異步時發生異常。您可以查看Exception.MessageException.InnerExceptionException.StackTrace等以獲得更多詳細信息。

更新:

檢查異常的類型SmtpException的,如果是,你可以查詢的StatusCode。類似於

if(e.Exception is SmtpException) 
{ 
    SmtpStatusCode code = ((SmtpException)(e.Exception)).StatusCode; 
    //and go from here... 
} 

check here瞭解更多詳情。

+0

Icarus - 我可以看到InnerException然後我如何測試(相當於StatusCode)並重新發送消息。有任何想法嗎? – dotnetnoob 2013-02-28 15:46:44

+0

@dotnetnoob檢查我的更新 – Icarus 2013-02-28 15:50:55

+0

謝謝,這正是我需要的。 – dotnetnoob 2013-02-28 17:15:08