Windows Mobile使用.NET Compact Framework开发Winform时如何Dispose资源

背景

在开发3G应用的时候,程序退出了,需要自动关闭已经打开的链接。这样需要在Winform退出的时候把其分配的资源都dispose掉。本文讲述Winform Dispose资源的几种方法。

方案

方案一

使用VS2005以上做Winform开发,Visual Studio会自动生成一个用于保存layout信息和处理事件的partial class(一般叫做*.Designer.cs)这个partial class里面重载了Dispose的方法。

  1. /// <summary>
  2. /// Clean up any resources being used.
  3. /// </summary>
  4. /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
  5. protected override void Dispose(bool disposing)
  6. {
  7.     if (disposing && (components != null))
  8.     {
  9.         components.Dispose();
  10.     }
  11.     base.Dispose(disposing);
  12. }
复制代码

但是这个partial class是由Visual Studio自动生成的,最好不要手工修改,需要Dispose最简单的方法是把这个方法拷贝到另外一个类文件里面。一般为*.cs,然后加入需要Dispose的代码。

  1. /// <summary>
  2. /// Clean up any resources being used.
  3. /// </summary>
  4. /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
  5. protected override void Dispose(bool disposing)
  6. {
  7.     if (disposing && (components != null))
  8.     {
  9.         components.Dispose();
  10.     }
  11.     DisposeResources();
  12.     base.Dispose(disposing);
  13. }
复制代码

方案二

注册Disposed事件。

  1. this.Disposed += new EventHandler(MainForm_Disposed);
  2. void MainForm_Disposed(object sender, EventArgs e)
  3. {
  4.     Logger.Instance.LogTrace("MainForm_Disposed");
  5. }
复制代码

当Dispose调用下面代码的时候会调用该注册的事件处理函数。

  1. if (disposing && (components != null))
  2. {
  3.     components.Dispose();
  4. }
复制代码

可是这个方法有一个问题,如果该Form没有任何其他的components 时,MainForm_Disposed是不会被调用的,因此有下面方案三。

方案三

由于方案二的问题,提出了方案三。方案三是使用一个继承于Component的类Disposer,这个Disposer类保存需要Dispose的类的引用,然后把这个Disposer类加入到components中。

  1. internal class Disposer : Component
  2. {
  3.     private IDisposable _disposable;
  4.     internal Disposer(IDisposable disposable)
  5.     {
  6.         _disposable = disposable;
  7.     }
  8.     protected override void Dispose(bool disposing)
  9.     {
  10.         if (disposing)
  11.         {
  12.             if (_disposable != null)
  13.             {
  14.                 _disposable.Dispose();
  15.             }
  16.         }
  17.         base.Dispose(disposing);
  18.     }
  19. }
复制代码

定义一个继承于Component的类Disposer。Disposer保存了需要Dispose的类的引用。

  1. components.Add(new Disposer(connectionManager));
复制代码

把Disposer的对象保存到 components里面,这样components 就不可能为null。下面的代码就会执行。

  1. if (disposing && (components != null))
  2. {
  3.     components.Dispose();
  4. }
复制代码

connectionManager为需要Dispose的成员,这个对象的类需要继承IDisposable 并重载Dispose。

  1. sealed class ConnectionManager : IDisposable
  2. {
  3.     public void Dispose()
  4.     {
  5.         //Disconnect the network
  6.     }
  7. }
复制代码

方案三就完成了,大家merry chrismas。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: .NET WinForm是一种用于开发Windows桌面应用程序的技术框架。我在使用.NET WinForm开发过程中积累了一些经验和心得,现将其总结如下。 首先,.NET WinForm具有丰富的控件库,并且提供了灵活的布局方式。我们可以根据需要选择合适的控件来设计用户界面,并通过属性和事件的设置来实现交互功能。此外,WinForm还支持多种布局方式,例如流式布局、表格布局等,能够满足不同界面设计的需求。 其次,开发过程中要注意控件的命名规范和代码的结构化。一个良好的命名规范可以使代码更易读、易维护,并且方便与团队合作。另外,将代码按功能模块进行组织,可以提高代码的可读性和可维护性。 另外,对于数据处理方面,我们可以使用.NET提供的ADO.NET来进行数据库的操作。ADO.NET提供了一套完整的对象模型,可以方便地连接、查询和更新数据库。此外,为了提高性能,我们可以使用数据绑定技术将数据与控件进行关联,从而实现数据的显示和编辑。 此外,为了提高用户体验,我们可以使用多线程来处理耗的操作。在WinForm中,主线程负责界面的渲染和响应用户操作,而通过新建一个后台线程来处理耗任务,可以避免界面的阻塞,提高用户体验。 最后,为了保证应用程序的稳定性和可靠性,我们需要进行适当的异常处理。在编写代码的过程中,我们应该考虑到各种可能出现的异常情况,并编写相应的异常处理代码,以防止程序崩溃或出现不可预料的错误。 综上所述,使用.NET WinForm进行开发可以帮助我们快速构建功能丰富的Windows桌面应用程序。在开发过程中,我们应该注意控件的选择和布局的合理安排,遵循良好的命名规范和代码结构化,合理处理数据和耗操作,添加适当的异常处理,以保证应用程序的稳定性和可靠性。 ### 回答2: .NET WinForm是一种使用C#或其他.NET支持的语言开发的桌面应用程序的框架。在.NET WinForm开发过程中,我积累了一些经验和技巧,我将在下面的笔记中进行总结。 首先,我要着重强调良好的用户界面设计。一个简洁、直观和易用的界面对于用户来说非常重要,因此在设计界面,我会参考标准的用户体验原则和设计规范,确保界面元素的布局合理,按钮和菜单项的命名清晰明了。 其次,我经常使用控件的继承和自定义控件来提高开发效率和代码复用性。通过继承现有控件,并添加自定义功能或修改样式,可以快速创建符合特定需求的控件。这样可以减少代码的重复编写,并且便于后续的维护和扩展。 此外,我会尽量避免在界面上编写过多的业务逻辑。为了保持界面的简洁和响应速度,我将业务逻辑封装在独立的类中,并使用事件机制进行交互。这样可以实现界面和数据的解耦,提高代码的可维护性和可测试性。 对于数据的处理,我会使用.NET提供的数据绑定机制。通过将数据源与控件进行绑定,可以简化数据的展示和操作,减少手动编写代码的工作量。同,数据绑定还可以实现数据的实更新和显示,提升用户体验。 最后,我会使用调试工具和日志记录来帮助定位和解决问题。.NET WinForm提供了丰富的调试功能,如断点调试、条件断点和调试输出等。通过适当的调试设置和日志记录,可以及发现问题,并进行相关的修复和优化。 总之,这些是我在.NET WinForm开发过程中的一些心得体会。良好的界面设计、控件的继承和自定义、业务逻辑和界面的解耦、数据绑定的使用以及调试工具和日志记录的运用,都是我在开发过程中重要的思考和实践。我相信通过不断学习和尝试,我将能够提高开发效率和代码质量,为用户创造出更好的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值