2012-02-08 4 views
12

私は電子メールを送信するのにSMTPClient.Send(mail)メソッドを使用していましたが、電子メールIDが存在しない場合(存在しない場合)、アプリケーションは例外を受け取り、ユーザがさらなるタスクを実行できるようになるまで待機します。SmtpClient.SendAsyncのuserTokenオブジェクトから得られる利点は何ですか?

私はSMTPClient.SendAsyncメソッドを使用することを考えました。

私の疑い!メソッドにパラメータとして渡されるこのuserTokenオブジェクトはどこで使用できますか?私は多くのものをオンラインで検索しましたが、良い例は見つかりません。でもMSDNに彼らはこの

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

のようにそれを使用する。しかし、それは本当にのために何を使用することができますか?

ありがとうございます。

+0

過去のプロジェクトで使用した単純化されたケースを以下に説明しました。 –

答えて

20

次の場合に使用できます。バッチ電子メール送信のアプリケーションがあるとします。あなたはメッセージを作成します(すべての受信者に対して異なるメッセージ\添付ファイルを1つのメッセージにまとめることはできません)。たとえば、20人の受信者を選択し、「すべて送信」ボタンを押します。送信のために、 "プール"からSendAsyncといくつかのSmtpClientインスタンスを使用します(以前の呼び出しが完了しないうちに、SmtpClientは1つのインスタンスでSendAsyncを2度呼び出すことができません)。

あなたはすべてのあなたは、高度なロギングを行うべきSendAsync通話のための単一のSmtpClientSendCompletedハンドラがあります。失敗したメッセージの受信者の送付、名前(アドレス、あるいは添付ファイル)の結果をログに記録しますが、AsyncCompletedEventArgsをUserStateの助けを借りてのみこの情報を提供することができます。したがって、この目的のための基本的なパターンは、カスタムユーザー状態オブジェクトを使用することです。 youがhandlerにneed will fieldsをcontains

Interface::So simplified exampleをsee

public interface IEmailMessageInfo{ 
    string RecipientName {get;set;} 
} 

Asyncのstateのclass:Here

/// <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; 
    } 
} 

email sending用code:

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()メソッドを使用して電子メールを送信する場合は問題ありません。これが参考になることを願っています。

関連する問題