我最近遇到过Dispose方法必须在C#程序中进行硬编码的情况。否则,电子邮件中使用的文件将永远是"永远"锁定,甚至没有流程管理器能够告诉我谁/什么锁定它。我不得不使用 Unlocker Assistant 强制删除文件,但我担心现在我已经在服务器上留下了一些已分配的内存块。
我所指的代码是:
MailMessage mail = new MailMessage();
mail.From = new MailAddress("reception@domain.com", "###");
mail.Subject = "Workplace Feedback Form";
Attachment file = new Attachment(uniqueFileName);
mail.Attachments.Add(file);
mail.IsBodyHtml = true;
mail.CC.Add("somebody@domain.com");
mail.Body = "Please open the attached Workplace Feedback form....";
//send it
SendMail(mail, fldEmail.ToString());
上面的代码使文件从uniqueFileName
被Attachment句柄锁定,我无法将其删除,因为此代码是从客户端计算机(而不是从服务器本身)运行的,该文件的句柄是不可能找到的。
在我强制删除文件之后,我在另一个论坛上发现我应该有一个Disposed of Attachment对象。
所以我在发送电子邮件后添加了这些代码行......
//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"然后使用它,否则使用它。
这个When to Dispose?和C# Dispose : when dispose and who dispose it确实在某种程度上回答了我的问题,但我仍然对这些问题感到困惑"什么时候使用。
答案 0 :(得分:6)
using
:
using(MyDisposableType obj = new MyDisposableType())
{
...
}
是"语法糖" (或简写符号)等同于
MyDisposableType obj = new MyDisposableType();
try {
...
} finally {
obj.Dispose();
}
中所述
答案 1 :(得分:4)
我应该将它包装在using语句中吗?
要么将主要代码放在try
块中,要将Dispose
放在finally
块中。
using
只需用较少的代码安全地实现Dispose
模式。 using
会将Dispose
放在finally
块中,以便即使抛出异常也会处置该对象。现在的方式,如果抛出异常,对象将不会被处理,而是在收集垃圾时清理。
我从未遇到过无法使用using
并且必须手动使用try
/ {{1}的情况与finally
。
所以选择权归您所有 - 您可以在Dispose()
块中使用Dispose
,这可能与您使用finally
的情况相同。