有一个Winform下的摄像头使用实例,摄像头被封装成了一个控件,但是当项目第一次运行时正常,以后再次运行就会弹出窗口,如下:
出现这个窗口是不是因为资源没有释放,如果是应该怎样进行释放,各位大侠,有相关的方法吗???

解决方案 »

  1.   

    实现IDisposable接口,实现Dispose()方法。
      

  2.   

    这是摄像头是“Import”非托管资源
      

  3.   

    在.NET平台中内存管理由GC全负责,无需也不需开发者操心,而对于非托管资源GC就无能为力,这通常有两种参考的方案:Finalize和IDisposable模式,Finalze最大的问题就是执行的不确定性和对性能的阻塞,所以我们更推荐以IDisposable配合Finalized的方式来实现对非托管资源的管理工作。在.NET中,简单的说IDisposable模式就是在自定义类中实现IDisposable接口,在其中定义的Dispose方法中释放非托管资源。那么对于您的问题就有了对应的思路:Q1:是不是只有存在非托管资源的情况下才有必要实现Dispose接口?
    Q2:在实现Dispose接口的时候,释放托管资源的代码段应该写什么?
    Q3:托管资源本来就由GC来处理,我想在实现Dispose接口的时候,无需手动写释放托管资源的代码吧?A1:这是显然的,在.NET框架类库中实现IDisposable接口的基本是持有非托管资源的类型,例如IDbConnection、Font、Brush、Steam、TextReader等等,从名字就可以看出端倪;
    A2:应该怎么写,取决于你释放的非托管资源是什么,一般来说就是调用Win API完成资源清理,例如对于数据库资源资源你通常:
        if (disposing)
        {
            if (connection != null)
                connection.Dispose();
        }
    而对于文件资源,你可能
        if (fileHandle != IntPtr.Zero)
        {
            CloseHandle(fileHandle);
            fileHandle = IntPtr.Zero;
        }
    A3:记住,永远避免自行处理托管资源。
      

  4.   

    实现IDisposable接口,实现Dispose()方法。
      

  5.   

    应该怎么写,取决于你释放的非托管资源是什么,一般来说就是调用Win API完成资源清理