相关疑难解决方法(0)

C#如何实现Dispose方法

我需要一些关于该Dispose方法实现的建议.

在我们的应用程序中,用户设计自己的UI.我有一个预览窗口,显示UI的外观.此UI中绘制的所有对象最终都来自公共基类ScreenObject.我的预览管理器包含对ScreenGrid的单个对象引用,ScreenGrid是整个预览区域的网格对象.

问题#1

我的一些派生屏幕类保留了非托管资源,例如数据库连接,位图图像和WebBrowser控件.这些类需要处理这些对象.我在基类中创建了一个虚Dispose方法,ScreenObject然后Dispose在每个派生类中实现了一个覆盖非托管资源的覆盖方法.但是,现在我刚刚创建了一个名为的方法Dispose,我没有实现IDisposable.我应该实施IDisposable吗?如果是这样,我该如何实现它?

  • 只是在具有非托管资源的派生类上
  • 基类和具有非托管资源派生类OR
  • 基类和所有派生类,包括那些没有非托管资源的类

将虚Dispose方法放在没有非托管资源的基类中是否错误,以便您可以利用多态?

问题2

在阅读有关Dispose方法和IDisposable接口的过程中,Microsoft声明处置对象应该只调用Dispose其父对象的方法.父母将为其父母调用它,依此类推.对我而言,这似乎是倒退.我可能想要处理一个孩子但保留其父母.

我认为它应该是另一种方式,处置的对象应该处理它的孩子.然后孩子们应该处理他们的孩子等等.

我错在这里还是我错过了什么?

c# dispose

31
推荐指数
2
解决办法
6万
查看次数

何时使用Dispose或何时使用Using

我最近遇到过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());
Run Code Online (Sandbox Code Playgroud)

上面的代码使文件不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 …
Run Code Online (Sandbox Code Playgroud)

c# asp.net dispose using handles

1
推荐指数
2
解决办法
172
查看次数

标签 统计

c# ×2

dispose ×2

asp.net ×1

handles ×1

using ×1