Tag: dispose

为什么Code Analysis告诉我,“不要多次丢弃对象”:

在这段代码上: public static string Base64FromFileName(string fileName) { try { FileInfo fInfo = new FileInfo(fileName); long numBytes = fInfo.Length; FileStream fStream = new FileStream(fileName, FileMode.Open, FileAccess.Read); BinaryReader br = new BinaryReader(fStream); byte[] bdata = br.ReadBytes((int)numBytes); br.Close(); fStream.Close(); return Convert.ToBase64String(bdata); } catch(Exception e) { throw e; } } …我得到了Visual Studio的代码分析工具,警告,“ 不要多次丢弃对象……为了避免生成System.ObjectDisposedException,你不应该在对象上多次调用Dispose ” fStream.Close();” 线。 为什么? fStream是否在上面的行中,BinaryReader关闭了? 无论如何我不会更好地重构它: […]

为什么“Finalize方法不应该引用任何其他对象”?

我一直在思考为什么建议我们不要在finalize中释放托管资源。 如果您在http://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize.aspx上看到代码示例,并搜索字符串“Dispose(bool disposing)在两个不同的场景中执行”并阅读评论,你会明白我的意思。 我能想到的唯一可能性是它可能与以下事实有关:无法预测终结器何时被调用。 有谁知道正确的答案? 谢谢,误导

例外:参数无效(将新图像传递给pictureBox时)

我已经在PictureBox控件中有了一个图像,现在我想传递一个新的图像。 会发生什么,是allpication Disposes(我捕获exception:“参数无效”)。 这是我的代码: using (Image img = Image.FromFile(open.FileName)) { part.Picture = img; pictureBox1.InitialImage = null; pictureBox1.Image = img; } 因此,当代码退出该方法时,它会直接显示为此主表单的Displose。 我只在Form1启动的行上捕获exception。 在这个问题上,没有什么可以解除的。 当pictureBox正在绘画时(在Paint事件中),它一定是错的,但我并没有被它所吸引。 我真的不知道如何解决这个问题。 我甚至试图用来清除所有资源(通过调用垃圾收集),但似乎没有任何工作。 还有一件事:“part”是List的引用,所以当我尝试删除当前图像(用新图像替换它)时,我得到了另一个例外,例如: “进程无法访问该文件,因为它正被另一个进程使用”。 这是否与第一个exception有关(当新图像未在pictureBox中绘制时)?

using子句会关闭此流吗?

我显然已经习惯了一个糟糕的编码习惯。 以下是我编写的代码示例: using(StreamReader sr = new StreamReader(File.Open(“somefile.txt”, FileMode.Open))) { //read file } File.Move(“somefile.txt”, “somefile.bak”); //can’t move, get exception that I the file is open 我认为因为using子句在StreamReader上显式调用了Close()和Dispose() , FileStream也会关闭。 我能解决问题的唯一方法是将上面的块更改为: using(FileStream fs = File.Open(“somefile.txt”, FileMode.Open)) { using(StreamReader sr = new StreamReader(fs)) { //read file } } File.Move(“somefile.txt”, “somefile.bak”); // can move file with no errors 是否应该通过在第一个块中处理关闭StreamReader来关闭底层的FileStream ? […]

为什么处置对象在处理后使用它时不会抛出exception?

在被处置对象上调用方法是否合法? 如果是,为什么? 在下面的演示程序中,我有一个一次性类A (它实现了IDisposable接口)。据我所知,如果我将一次性对象传递给using()构造,那么Dispose()方法会在结束括号中自动调用: A a = new A(); using (a) { //… }//<——— a.Dispose() gets called here! //here the object is supposed to be disposed, //and shouldn't be used, as far as I understand. 如果这是正确的,那么请解释这个程序的输出: public class A : IDisposable { int i = 100; public void Dispose() { Console.WriteLine(“Dispose() called”); } public void […]

为什么在main()退出之前调用Dispose()?

我的.net服务通过在Main()循环退出之前调用finally块中的resourceName.Dispose()来清除所有非托管资源。 我真的必须这样做吗? 我是否认为我不能泄漏任何资源,因为这个过程正在结束? Windows将关闭任何不再使用的句柄,对吧?

是否有一个为using语句实现IDisposable的公共对象列表?

我想知道是否有某种备忘单,其中的对象与using语句一致… SQLConnection , MemoryStream等。 更进一步,甚至可以显示其他“拼图”,就像你应该在关闭之前使用语句括号实际调用connection.Close()一样。 这样的事情存在吗? 如果没有,也许我们应该制作一个。

在SQLDataReader上使用

我知道我之前提过了一个相关的问题。 我只是想到了另一个想法。 using (SqlConnection conn = new SqlConnection(‘blah blah’)) { using(SqlCommand cmd = new SqlCommand(sqlStatement, conn)) { conn.open(); // *** do I need to put this in using as well? *** SqlDataReader dr = cmd.ExecuteReader() { While(dr.Read()) { //read here } } } } 这个论点是:由于SqlDataReader dr对象不是一个新的OBJECT LIKE连接或命令对象,它只是一个指向cmd.ExecuteReader()方法的引用,我是否需要将阅读器放在一个using 。 (现在基于我以前的post,我的理解是任何使用IDisposable对象都需要放入using ,而SQLDataReaderinheritance自IDisposable ,所以我需要把它放进去。我的判断是否正确?)我只是因为它不是一个新对象,所以它会在处理一个只是指向命令的引用指针的对象时引起任何问题吗? 非常感谢

我需要在ManualResetEvent上调用Close()吗?

我一直在阅读.NET Threading,并正在研究一些使用ManualResetEvent的代码。 我在互联网上找到了很多代码示例。 但是,在阅读WaitHandle的文档时,我看到以下内容: WaitHandle实现了Dispose模式。 请参阅实现Finalize和Dispose以清理非托管资源。 没有任何样本似乎在他们创建的ManualResetEvent对象上调用.Close(), 甚至是来自pfxteam博客的好的Recursion and Concurrency文章 ( 编辑 – 这有一个我错过的使用块)。 这只是示例疏忽,还是不需要? 我很好奇,因为WaitHandle“封装了特定于操作系统的对象”,因此很容易出现资源泄漏。

c#静态成员是如何以及何时处置的?

我有一个包含大量静态成员的类,其中一些保留对托管和非托管对象的引用。 例如,一旦引用了Type,就会调用静态构造函数,这会导致我的类启动tasks的blockingQueue。 例如,当调用其中一个静态方法时会发生这种情况。 我实现了IDisposable,它为我提供了处理我创建的任何实例对象的方法。 但是,如果使用者不从我的类创建任何实例对象,则永远不会调用这些方法。 如何以及在何处放置代码来处理由我的类的静态部分维护的引用? 我一直认为在发布最后一个实例对象时会发生静态引用资源的处理; 这是我第一次创建一个不会创建任何实例的类。