2012-02-08 69 views
12

我正在使用SMTPClient.Send(mail)方法發送電子郵件,但後來我看到,如果電子郵件ID不存在(不存在),我的應用程序會等待,直到它收到異常,然後允許用戶執行進一步的任務。我可以從SmtpClient.SendAsync的userToken對象獲得什麼好處?

所以我想使用SMTPClient.SendAsync方法。

我的疑問!!在哪裏可以使用這個userToken對象作爲參數傳遞給方法?我在網上搜索了很多東西,但沒有找到一個好例子。即使在MSDN他們使用像這樣

string userState = "test message1"; 
client.SendAsync(message, userState); 

那麼是什麼能不能真正用的?

預先感謝您。

+0

我在下面描述了一個我曾經使用過的一個簡化案例。 – 2012-02-11 15:03:41

回答

20

您可以在以下情況下使用它:假設您有批量電子郵件發送應用程序。您撰寫郵件(每個收件人都有不同的郵件\附件,因此您無法將其合併爲單個郵件),請選擇例如20個收件人並按下「全部發送」按鈕。爲了向您發送SendAsync和來自「池」的多個SmtpClient實例(因爲在前一個調用未完成之前,SmtpClient不允許在一個實例上調用兩次SendAsync)。

你有一個SmtpClientSendCompleted處理程序中,你應該執行高級日誌所有SendAsync電話:日誌發送,名稱失敗消息的收件人(地址甚至是附件),但AsyncCompletedEventArgs結果只能在UserState的幫助下提供這些信息。所以用於此目的的基本模式是使用自定義用戶狀態對象。所以看到簡化的例子:一個包含您將需要在處理器領域

接口:

public interface IEmailMessageInfo{ 
    string RecipientName {get;set;} 
} 

異步狀態類:

/// <summary> 
/// User defined async state for SendEmailAsync method 
/// </summary> 
public class SendAsyncState { 

    /// <summary> 
    /// Contains all info that you need while handling message result 
    /// </summary> 
    public IEmailMessageInfo EmailMessageInfo { get; private set; } 


    public SendAsyncState(IEmailMessageInfo emailMessageInfo) { 
     EmailMessageInfo = emailMessageInfo; 
    } 
} 

這裏發送電子郵件的代碼:

SmtpClient smtpClient = GetSmtpClient(smtpServerAddress); 
smtpClient.SendCompleted += SmtpClientSendCompleted; 
smtpClient.SendAsync(
    GetMailMessage() 
    new SendAsyncState(new EmailMessageInfo{RecipientName = "Blah-blah"}) 
); 

和處理程序代碼示例:

private void SmtpClientSendCompleted(object sender, AsyncCompletedEventArgs e){ 
    var smtpClient = (SmtpClient) sender; 
    var userAsyncState = (SendAsyncState) e.UserState; 
    smtpClient.SendCompleted -= SmtpClientSendCompleted; 

    if(e.Error != null) { 
     tracer.ErrorEx(
      e.Error, 
      string.Format("Message sending for \"{0}\" failed.",userAsyncState.EmailMessageInfo.RecipientName) 
     ); 
    } 

    // Cleaning up resources 
    ..... 
} 

請讓我知道你是否需要更多的細節。

1

如果您使用async(),您還需要具有事件處理程序。

static void smtpClient_SendCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e) 
    { 
     //to be implemented   
    } 

這很好,可以使用Async()方法發送電子郵件。希望這是有幫助的。