如何理解C#SendAsync功能?

时间:2013-12-04 13:34:29

标签: c# sendasync

当我使用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函数中,为什么会发生这种情况?

1 个答案:

答案 0 :(得分:2)

你必须在调用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() 功能中使用SendAsync()代替Send()。这是因为SendAsync函数启动了一个用于发送邮件的新线程,而Send将停止执行程序,直到邮件被发送为止。您不应该使用SendAsync功能的另一个原因是因为根据微软一次只能发送一封邮件。这意味着使用SendAsync函数超过1个邮件将导致它抛出异常。