スレッド内でメールを送信するコンソールアプリがあります。
このスレッドメソッドでは、各受信者に電子メールを送信するループがあります。
以前のメールが送信される前に複数のメールを送信しようとすると、問題が発生します。
私のコード:
foreach(var m in mailModel.Recipients)
{
Mailmanager.SendMessageS(mailModel.DomainName, mailModel.Severity, DateTime.Now, m);
}
そしてsendメソッド:
public static async Task SendMessageS(string domainName, ErrorSeverity severity, DateTime errorTime, Recipient recipient)
{
try
{
string error = "";
string fromEmail = "[email protected]";
string toEmail = recipient.SendEmailTo;
MailMessage message = new MailMessage(fromEmail, toEmail);
Guid guid = Guid.NewGuid();
SmtpClient smtpClient = new SmtpClient(server, port);
/*if (_useAuthentication)*/
smtpClient.Credentials = new NetworkCredential("", "");
smtpClient.EnableSsl = false;
//mail.Subject = subject;
//mail.Body = body;
message.Subject = "Problem ( " + severity + ") " + domainName;
message.Body = BuildMessage(error, recipient.RecipientName, domainName, errorTime, severity);
smtpClient.SendCompleted += SendCompletedCallback;
await smtpClient.SendMailAsync(fromEmail, toEmail, message.Subject, message.Body /* user state, can be any object*/);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
私はこの警告を受けています:
この呼び出しは待機されていないため、現在のメソッドの実行は呼び出しが完了する前に続行されます。呼び出しの結果にawaitopeartorを適用することを検討してください
警告は理解できますが、すべての受信者を通過するループがあるため、これをどのように達成できるかわかりません。
どうすればこれを正しく行うことができますか?
ユーティリティメソッドが非同期操作を実行しているため、これは簡単な修正です(await
への呼び出しにキーワードを追加Mailmanager.SendMessageS
)。
foreach(var m in mailModel.Recipients)
{
await Mailmanager.SendMessageS(mailModel.DomainName, mailModel.Severity, DateTime.Now, m);
}
全体的なプロセスとしてそれを行うためのより良い方法があるかもしれません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加