2011-05-28 74 views
1

我已經制作了一個應用程序,將一些文件壓縮並通過電子郵件發送。大約有70個文件(它們的總大小約爲800kb)。電子郵件發件人凍結

的壓縮過程凍結我的應用程序(但其確定,因爲它需要大約一秒鐘)

的問題是與電子郵件程序。調試時,我發現整個電子郵件製備過程是相當快的,除了

smtp.Send(消息)

其完全凍結我的應用程序:5秒後,應用程序仍在運行但是從任務欄消失,並且即使在電子郵件發送之後,應用程序仍然不響應。

發送電子郵件功能:

public void SendMail(string FromGmailEmail, string GmailPassword, string ToEmail, string Subject, string Body, string[] AttachmentsPaths) 
    { 
     var fromAddress = new MailAddress(FromGmailEmail, "None"); 
     var toAddress = new MailAddress(ToEmail, "None"); 
     string fromPassword = GmailPassword; 
     string subject = Subject; 
     string body = Body; 

     var smtp = new SmtpClient 
     { 
      Host = "smtp.gmail.com", 
      Port = 587, 
      EnableSsl = true, 
      DeliveryMethod = SmtpDeliveryMethod.Network, 
      UseDefaultCredentials = false, 
      Credentials = new NetworkCredential(fromAddress.Address, fromPassword) 
     }; 
     var message = new MailMessage(fromAddress, toAddress); 
     message.Subject = subject; 
     message.Body = body; 

     try 
     { 
      for (int i = 0; i < AttachmentsPaths.Length; i++) 
       message.Attachments.Add(new Attachment(AttachmentsPaths[i])); 
     } 
     catch (FileNotFoundException) 
     { 
     } 
     smtp.Timeout = int.MaxValue; 
     smtp.Send(message); 
    } 

我發送電子郵件時,打開一個新的線程。

public void OpenEmailThread(string FromGmailEmail, string GmailPassword, string ToEmail, string Subject, string Body, string[] AttachmentsPaths) 
    { 
     Thread thread = new Thread(() => SendMail(FromGmailEmail, GmailPassword, ToEmail, Subject, Body, AttachmentsPaths)); 
     thread.Name = "EmailThread"; 
     thread.Start(); 
    } 

側面說明:由於某種輸出告訴我:

型 'System.IO.IOException' 的第一次機會異常出現在mscorlib.dll

smtp.Send(message)

(但是這是我最不問題)

編輯:原來我是編輯文件,而他發送。我知道這會發生,這就是爲什麼我在發郵件時添加了一個名爲「IsEmailing」的bool變量來鎖定文件。原來這些文件仍然在「smtp.Send(message);」之後上傳。

解決方案:在發送之前將郵件附件壓縮並且僅在發送之前。這樣,壓縮文件只會出現一次,所以不能修改.zip文件。

+0

購買更好的互聯網服務或使用BackgroundWorker。 – 2011-05-28 23:41:07

回答

1

我使用它來發送郵件上一個新的線程和它的作品確定...

 public void SendEmail(string from, string to, string subject, string body, string attachPath) 
    { 
     Thread threadSendMails; 
     threadSendMails = new Thread(delegate() 
     { 

      sendEmail(from, to, subject, body, attachPath); 

     }); 

     threadSendMails.IsBackground = true; 
     threadSendMails.Start(); 

    } 

哪裏Sendmail是我自己的郵件功能。

+0

我試着添加「thread.IsBackground = true」,它沒有幫助,你可以發佈你的sendMail函數嗎? – 2011-05-28 23:41:35

+0

試圖打開一個新項目併發送電子郵件,它工作正常。謝謝。 – 2011-05-28 23:47:18

+0

你還想要sendMail代碼嗎? – Oliver 2011-05-29 00:14:48

相關問題