次の場合に使用できます。バッチ電子メール送信のアプリケーションがあるとします。あなたはメッセージを作成します(すべての受信者に対して異なるメッセージ\添付ファイルを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
.....
}
詳細が必要な場合はお知らせください。
過去のプロジェクトで使用した単純化されたケースを以下に説明しました。 –