您可以在以下情况下使用它:假设您有批量发送电子邮件的应用程序。您撰写消息(每个收件人都有不同的消息\附件,因此您不能将其组合成一条消息),例如选择 20 个收件人并按下“全部发送”按钮。对于发送,您使用“池”中的 SendAsync 和几个 SmtpClient 实例(因为 SmtpClient 不允许在前一个调用未完成之前在一个实例上调用 SendAsync 两次)。
对于所有SendAsync调用,您有一个SmtpClientSendCompleted处理程序,您应该在其中执行高级日志记录:发送的日志结果、失败消息接收者的名称(地址甚至附件),但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
.....
}
如果您需要更多详细信息,请告诉我。