Я сделал приложение, которое архивирует некоторые файлы и отправляет их по электронной почте. Файлов около 70 (общий размер около 800кб).
Процесс zip замораживает мое приложение (но это нормально, потому что это занимает около секунды)
Проблема связана с процессом электронной почты. Во время отладки я обнаружил, что весь процесс подготовки письма выполняется довольно быстро, за исключением
smtp.Отправить(сообщение)
который полностью замораживает мое приложение: через 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.
on
smtp.Отправить(сообщение)
(но это меньшая из моих проблем)
EDIT: оказалось, я редактировал файл, пока он его отправлял. Я знал, что это произойдет, и поэтому я добавил логическую переменную с именем «IsEmailing», чтобы заблокировать файл во время отправки по электронной почте. Оказывается, файлы ВСЕ ЕЩЕ загружаются после "smtp.Send(message);".
Решение. Заархивируйте вложения перед отправкой И ТОЛЬКО ПЕРЕД ОТПРАВКОЙ. таким образом, ZIP-файл будет создан только один раз, поэтому ZIP-файл нельзя будет изменить.