您可以在以下情况下使用它:假设您有批量电子邮件发送应用程序。您撰写邮件(每个收件人都有不同的邮件\附件,因此您无法将其合并为单个邮件),请选择例如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