0

在 backgroundworkerdowork 事件的 Form1 中,我做了:

se.SendPhotos(photofilesDir + "\\" + "photofiles.zip");
se.SendPhotos(photofilesDir1 + "\\" + "photofiles.zip");
se.SendPhotos(photofilesDir2 + "\\" + "photofiles.zip");
se.SendPhotos(photofilesDir3 + "\\" + "photofiles.zip");

在 se 类 SendEmail 我做了:

public void SendPhotos(string fileNameToSend)
        {
            try
            {
                MailAddress from = new MailAddress("test@gmail.com", "User " + (char)0xD8 + " Name",
                System.Text.Encoding.UTF8);
                MailAddress to = new MailAddress("test@test");
                photosmessage = new MailMessage(from, to);
                photosmessage.Body = "Please check the log file attachment I have some bugs.";
                string someArrows = new string(new char[] { '\u2190', '\u2191', '\u2192', '\u2193' });
                photosmessage.Body += Environment.NewLine + someArrows;
                photosmessage.BodyEncoding = System.Text.Encoding.UTF8;
                photosmessage.Subject = "Log File For Checking Bugs" + someArrows;
                photosmessage.SubjectEncoding = System.Text.Encoding.UTF8;
                Attachment myAttachment = new Attachment(fileNameToSend, MediaTypeNames.Application.Octet);
                photosmessage.Attachments.Add(myAttachment);
                SmtpClient photossend = new SmtpClient("smtp.gmail.com", 587);
                photossend.SendCompleted += new SendCompletedEventHandler(photossend_SendCompleted);
                photossend.EnableSsl = true;
                photossend.Timeout = 10000;
                photossend.DeliveryMethod = SmtpDeliveryMethod.Network;
                photossend.UseDefaultCredentials = false;
                photossend.Credentials = new NetworkCredential("usern", "userpass");
                string userState = "test message1";
                photossend.SendAsync(photosmessage, userState);
                SendLogFile.Enabled = false;
                fname = fileNameToSend;
            }

            catch (Exception errors)
            {
                Logger.Write("Error sending message :" + errors);
            }
        }

        private void photossend_SendCompleted(object sender, AsyncCompletedEventArgs e)
        {
            photosmessage.Dispose();
            if (fname == @"C:\Users\Simbalip\AppData\Local\outputphotos\photosfiles3" + "\\" + "photofiles.zip")
            {
                photossendended = true;
            }
        }

后台workerdowork中的问题它永远不会发送最后一个photofilesDir3。我使用了一个断点,它到达:photosendended = true; 但是在我的电子邮件中,我只收到了 3 个为我发送的文件,而不是 4 个。

当我在后台工作人员上使用断点并执行 F11 时,我看到它在没有等待的情况下一个接一个地进行 4 次发送。

每次 photofiles.zip 里面都有不同的文件。现在我检查在行上做了一个断点:

if (fname == @"C:\Users\Simbalip\AppData\Local\outputphotos\photosfiles3" + "\\" + "photofiles.zip")

当它到达那里时,它一直都是真的 == fname never C:\Users\Simbalip\AppData\Local\outputphotos\photosfiles2 or 1 or photosfiles

但最后我得到了 3 个不同的 photofiles.zip 文件,每个文件都包含不同的文件,但其中一个文件从未发送过。

Myabe 我需要以某种方式发送电子邮件时,它会以某种方式发送,直到发送第一个电子邮件,然后发送下一个,例如在 Process 中存在 WaitForExit() 所以可能与电子邮件类似?

4

1 回答 1

2

的文档SmtpClient暗示它不支持并行操作。

如果正在进行电子邮件传输并且您再次调用 SendAsync 或 Send,您将收到 InvalidOperationException。

http://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.aspx

我建议在SendCompleted事件提出之前不要发送下一封电子邮件。这意味着您的代码发生了巨大的变化(对 SendPhotos 的每次调用实际上只是将一些内容添加到您在后台处理的待处理发送邮件操作的集合中)

于 2013-08-12T17:51:43.977 回答