【问题标题】:How to understand C# SendAsync function?如何理解 C# SendAsync 函数?
【发布时间】:2013-12-04 13:34:29
【问题描述】:

当我用C#编程批量发送邮件时,我的代码是这样的:

public static bool Send(MailAddress Messagefrom,
    string MessageTo,
    string MessageSubject,
    string MessageBody)
{
    MailMessage message = new MailMessage();
    message.From = Messagefrom;
    message.To.Add(MessageTo);
    message.Subject = MessageSubject;
    message.Body = MessageBody;            
    message.BodyEncoding = System.Text.Encoding.UTF8;
    //message.SubjectEncoding = Encoding.BigEndianUnicode;
    message.IsBodyHtml = true;
    message.Priority = MailPriority.High;            
    MailHelper mh = new MailHelper();
    SmtpClient sc = mh.setSmtpClient("smtp.qq.com", 25);   
    sc.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback);  
    try
    {                
        sc.SendAsync(message, message);                
    }
    catch (Exception e)
    {
        LogHelper.WriteLog("Main send failed....\t the detail info:" + 
            e.ToString());
        return false;
    }
    return true;
}

这是个问题!当第一封邮件发送失败时(例如邮件地址为null),下一封邮件无法发送!

因为我有很多邮件等待发送,如果出现这种情况,如何解决?例如失败的邮件可能还在这张桌子上,管理员手动处理。

但是这种情况很可能在Send函数中,为什么会这样呢?

【问题讨论】:

  • 您是否在 foreach 循环中发送邮件?您应该更改 Send() 的调用者,以便当它为一封邮件崩溃时,记录错误并继续发送下一封邮件
  • 是的,我用的是foreach循环,还在用循环吗?
  • 您可以尝试在 catch 块中调用 SendAsyncCancel 方法。请参阅“备注”下的msdn.microsoft.com/library/x5x13z6h.aspx
  • SendAsync() 函数在崩溃时不发送下一条消息?如果那为什么叫异步?
  • 来自 microsoft 知识库:调用 SendAsync 后,您必须等待电子邮件传输完成,然后再尝试使用 Send 或 SendAsync 发送另一封电子邮件。 - 所以我猜你必须取消发送过程。

标签: c# sendasync


【解决方案1】:

您必须在调用您的 Send() 函数的 foreach 循环中捕获错误并在某处记录错误:

foreach (var mail in mailsToSend)
{
    try
    {
        // Call your send function
        Send(...)
    }
    catch (Exception ex)
    {
        // Log the error somewhere (console, file, ...)
        Console.WriteLine("Error sending mail {0}", mail);
    }
}

这确保了当一封电子邮件发送失败并继续发送其他邮件时应用程序不会崩溃。

您还应该在 Send() 函数中使用 Send() 而不是 SendAsync()。这是因为SendAsync 函数启动了一个新线程来发送邮件,而 Send 将停止您的程序执行,直到邮件发送完毕。您不应该使用SendAsync 函数的另一个原因是,根据微软的说法,一次只能发送一封邮件。这意味着对超过 1 封邮件使用 SendAsync 函数会导致它抛出异常。

【讨论】:

    猜你喜欢
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    相关资源
    最近更新 更多