我当时使用SMTPClient.Send(mail)
方法发送电子邮件,但是后来看到,如果不存在电子邮件ID(不存在),我的应用程序将等待直到收到异常,然后允许用户执行进一步的任务。
所以我想到了使用SMTPClient.SendAsync方法。
我的疑问!作为参数传递给方法的userToken对象在哪里可以使用?我在网上搜索了很多东西,但找不到一个很好的例子。即使在MSDN中,他们也这样使用它
string userState = "test message1";
client.SendAsync(message, userState);
但是,它真正可以用来做什么呢?
先感谢您。
最佳答案
您可以在以下情况下使用它:假设您有批量发送电子邮件的应用程序。您撰写邮件(每个收件人有不同的邮件\附件,因此不能将其合并为一条邮件),例如选择20个收件人,然后按“全部发送”按钮。对于发送,请使用“池”中的SendAsync和多个SmtpClient实例(因为SmtpClient不允许在一个实例上两次调用SendAsync,而之前的调用尚未完成)。
对于所有 SendAsync 调用,您都有一个 SmtpClientSendCompleted 处理程序,您应该在其中执行高级日志记录:记录发送结果,失败消息的收件人的名称(地址或什至附件),但是 AsyncCompletedEventArgs 可以提供此信息仅在UserState的帮助下。因此,用于此目的的基本模式是使用自定义用户状态对象。因此,请参见简化示例:
该接口(interface)包含处理程序中所需的字段:
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
.....
}
请让我知道是否需要更多详细信息。
关于c# - 我可以从SmtpClient.SendAsync的userToken对象获得什么好处?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9187998/