发送批量电子邮件时出现错误“异步通话已在进行中。必须先完成或取消此操作,然后才能调用此方法”

我创建了一个控制台应用程序,用于将数据从一个数据库表迁移到另一个数据库中,在该表中迁移了客户记录,因此我必须通知他们更改密码。


public static async Task<bool> SendRegisterEmail(List<MailMessage> mailMessage)

{

    bool flag = true;

    try

    {

        var smtp = new SmtpClient();

        var taskEmails = mailMessage.Select(x => smtp.SendMailAsync(x));


        await Task.WhenAll(taskEmails); // **Error : An asynchronous call is already in progress. It must be completed or canceled before you can call this method**

    }

    catch (Exception ex)

    {

        throw ex;

    }


    return flag;

}

如果我删除等待任务,则电子邮件将成功成功异步发送。但是,当迁移操作完成时,AllAll(taskEmails)不会发送所有电子邮件。他们中的许多人在操作完成后仍在未关闭的控制台应用程序上未发送,并且我有1,00,000条记录,因此,如何在后台或正在运行的应用程序中继续电子邮件发送过程,直到所有电子邮件都成功发送为止?


慕后森
浏览 423回答 1
1回答

叮当猫咪

SmtpClient不允许您同时执行多个异步操作,这就是错误消息告诉您的内容。您正在执行以下操作:var smtp = new SmtpClient();var taskEmails = mailMessage.Select(x => smtp.SendMailAsync(x));await Task.WhenAll(taskEmails);您也没有处置SmtpClient,这也无济于事。而是,一个一个地发送给他们:using (var smtp = new SmtpClient()){&nbsp; &nbsp; foreach (var email in mailMessage) {&nbsp; &nbsp; &nbsp; &nbsp; await smtp.SendMailAsync(email);&nbsp; &nbsp; }}或SmtpClient为每个发送单独使用:Func<MailMessage, Task> sendFunc = async (x) => {&nbsp; &nbsp; using (var smtp = new SmtpClient()) {&nbsp; &nbsp; &nbsp; &nbsp; await smtp.SendMailAsync(x);&nbsp; &nbsp; }};var taskEmails = mailMessage.Select(sendFunc);await Task.WhenAll(taskEmails);似乎您也没有等待迁移功能发送的那些消息:// flag is Task<bool> herevar flag = Email.SendRegisterEmail(mailList);如果那不是错别字-您需要在适当的位置等待它们,或者将任务收集在某个列表中,并在循环在一起后(带有await Task.WhenAll)等待它们。请注意,如果您要发送大量电子邮件,尤其是向同一域发送电子邮件,尤其是并行发送-您使用的SMTP服务器(或收件人的SMTP服务器)可能对此不太满意,并可能将您列入黑名单。最好使用单独的后台流程,这将向您发送与迁移过程完全无关的电子邮件。只需让迁移过程将有关待处理电子邮件的信息插入到某个持久性存储(数据库表),然后让另一个应用程序浏览该表并发送电子邮件即可。这样,迁移过程就不会因电子邮件故障而中断,发送电子邮件的后台进程可以根据需要重试它们。
打开App,查看更多内容
随时随地看视频慕课网APP