您可以在以下情況下使用它:假設您有批量電子郵件發送應用程序。您撰寫郵件(每個收件人都有不同的郵件\附件,因此您無法將其合併爲單個郵件),請選擇例如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
.....
}
請讓我知道你是否需要更多的細節。
我在下面描述了一個我曾經使用過的一個簡化案例。 – 2012-02-11 15:03:41