2012-02-08 29 views
12

我正在使用SMTPClient.Send(mail)方法发送电子邮件,但后来我看到,如果电子邮件ID不存在(不存在),我的应用程序会等待,直到它收到异常,然后允许用户执行进一步的任务。我可以从SmtpClient.SendAsync的userToken对象获得什么好处?

所以我想使用SMTPClient.SendAsync方法。

我的疑问!!在哪里可以使用这个userToken对象作为参数传递给方法?我在网上搜索了很多东西,但没有找到一个好例子。即使在MSDN他们使用像这样

string userState = "test message1"; 
client.SendAsync(message, userState); 

那么是什么能不能真正用的?

预先感谢您。

+0

我在下面描述了一个我曾经使用过的一个简化案例。 – 2012-02-11 15:03:41

回答

20

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

请让我知道你是否需要更多的细节。

1

如果您使用async(),您还需要具有事件处理程序。

static void smtpClient_SendCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e) 
    { 
     //to be implemented   
    } 

这很好,可以使用Async()方法发送电子邮件。希望这是有帮助的。

相关问题