我当时使用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/

10-10 07:23