Tag: idisposable

确定托管与非托管资源

有关托管与非托管资源的问题很多。 我理解这两者的基本定义。 但是,我很难知道资源或对象何时被管理或不受管理。 当我想到非托管资源时,我倾向于认为本机代码不是直接属于.NET的一部分,例如pinvoke或编组资源。 我通常认为资源意味着与使用硬件的东西接口,例如文件句柄或网络连接也是不受管理的。 那些包装本机非托管资源(如FileStream .NET对象呢? FileStream必须使用非托管资源,但是当我实现IDisposable模式时,我应该将其视为托管或非托管资源吗? 到目前为止,我一直在假设如果对象实现了IDisposable ,那么它就被管理了。 我怎么知道IntPtr应该作为非托管resoruce处理?

内存泄漏问题

自从我被要求修复一个有内存泄漏问题的C#应用​​程序以来,我一直在阅读很多内容,但我没有找到这两个问题的答案: 请考虑以下代码: private static ArrayList list = new ArrayList(); public void Function() { list.add(object1); list.add(object2); //didn’t call clear() prior to reusing list list = new ArrayList(); } 由于列表在创建新列表之前未被清除,这是否会产生某种垃圾,在静态列表本身被释放后不会被释放? 第二个问题是关于Form.Dispose()。 我看到设计师视图(即标签,图片框)上的许多控件都需要进行处理。 似乎在Form上调用Dispose()会导致所有这些类型的控件也被处理掉(如果我错了,请纠正我),这很奇怪,因为设计师添加了一个覆盖的void Dispose(bool disposing)方法,没有这样的事。 我假设这发生在基本Form类的void Dispose(bool disposing)方法中。 上面的问题是我不清楚我需要做些什么才能确保正确处理所有Form的资源。 我不明白Form如何知道它需要处理哪些对象。 例如,如果在我的表单中我有一个自定义IDisposable对象的字段,表单是否知道它需要处理? 或者我应该添加自己发布对象所需的代码? 另外,如果我确实需要添加代码来处理某些对象,那么我该如何处理设计者已经覆盖void Dispose(bool disposing)方法的事实呢? 我应该编辑设计器生成的代码还是有更简洁的方法来执行此操作? 我希望这不要令人困惑,这有点难以解释。 谢谢

使用全局高速缓存时,如何修复CA2000 IDisposable C#编译器警告

CA2000是关于IDisposable接口的警告: CA2000:Microsoft.Reliability:在方法’ImportProcessor.GetContext(string)’中,在对所有引用超出范围之前,在对象’c’上调用System.IDisposable.Dispose。 我的方法用于存储上下文缓存,如下所示: public class RegionContext : IDisposable { /* Implement Dispose() here */ } private Dictionary contextCache = new ….. (); public RegionContext GetContext(string regionCode) { RegionContext rc = null; if (!this.contextCache.TryGetValue(regionCode.ToUpper(), out rc)) { rc = new RegionContext(regionCode); this.contextCache.Add(regionCode.ToUpper(), rc); } return rc; } 你会在哪里使用修复此编译器警告的using()语句? 我的外部类实际上在自己的实现中迭代并处理contextCache中的内容。 我要压制它,还是有办法正确摆脱这个警告?

为什么处置对象在处理后使用它时不会抛出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 […]

哪个更好,何时:使用语句或在C#中的IDisposable上调用Dispose()?

假设我有以下内容: using(var ctx = DataContextFactory.Create(0)) { … Some code … } 为什么不做以下操作而失去几个花括号?: var ctx = DataContextFactory.Create(0); ctx.Dispose(); 感谢您的建议!

如何处理具有异步方法的对象?

我有这个对象PreloadClient实现IDisposable ,我想处理它,但在异步方法完成他们的调用后……这没有发生 private void Preload(SlideHandler slide) { using(PreloadClient client = new PreloadClient()) { client.PreloadCompleted += client_PreloadCompleted; client.Preload(slide); } // Here client is disposed immediately } private void client_PreloadCompleted(object sender, SlidePreloadCompletedEventArgs e) { // this is method is called after a while, // but errors are thrown when trying to access object state (fields, properties) } […]

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

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

包含实现IDisposable的项的会话

在ASP.NET中,如果项目保留在实现IDisposable的会话状态,但是当会话到期时,应用程序永远不会被应用程序专门删除和处理,那么将在对象上调用Dispose()将执行Dipose()中的任何代码吗?

拦截IDisposable.Dispose中的exception

在IDisposable.Dispose方法中有一种方法可以判断是否抛出exception? using (MyWrapper wrapper = new MyWrapper()) { throw new Exception(“Bad error.”); } 如果在using语句中抛出exception,我想在处理IDisposable对象时知道它。

using关键字和IDisposable接口之间有什么关系?

如果我使用using关键字,我还需要实现IDisposable吗?