Недавно я столкнулся с ситуацией, когда метод Dispose пришлось жестко запрограммировать в программе на C#. В противном случае файл, используемый в электронном письме, будет заблокирован «навсегда», и даже Process Manager не сможет сказать мне, кто/что заблокировало его. Мне пришлось использовать Unlocker Assistant, чтобы принудительно удалить файл, но я боюсь, что теперь я оставил некоторые выделенные блоки памяти на сервере.
Код, который я имею в виду, таков:
MailMessage mail = new MailMessage();
mail.From = new MailAddress("[email protected]", "###");
mail.Subject = "Workplace Feedback Form";
Attachment file = new Attachment(uniqueFileName);
mail.Attachments.Add(file);
mail.IsBodyHtml = true;
mail.CC.Add("[email protected]");
mail.Body = "Please open the attached Workplace Feedback form....";
//send it
SendMail(mail, fldEmail.ToString());
Приведенный выше код оставил файл из uniqueFileName
заблокированным дескриптором вложения, и я не смог его удалить, а поскольку этот код запускался с клиентской машины (а не с самого сервера), дескриптор файла было невозможно найти.
После того, как я принудительно удалил файлы, я обнаружил на другом форуме, что должен был удалить объект вложения.
Поэтому я добавил эти строки кода после того, как электронное письмо было отправлено...
//dispose of the attachment handle to the file for emailing,
//otherwise it won't allow the next line to work.
file.Dispose();
mail.Dispose(); //dispose of the email object itself, but not necessary really
File.Delete(uniqueFileName); //delete the file
Должен ли я вместо этого обернуть это в оператор using
?
И в этом суть моего вопроса. Когда мы должны использовать Using и когда мы должны использовать Dispose? Я надеюсь, что между ними есть четкое различие, которое говорит, что если вы делаете «X», то используйте это, иначе используйте это.
Это Когда удалять? и это C# Dispose : когда распоряжаться и кто его распоряжается несколько отвечает на мой вопрос, но я все еще не понимаю "условий" о том, когда их использовать.