Tag: idisposable

识别IDisposable对象

我必须检查一些其他人有一些内存泄漏的代码。 现在我正在搜索一次性对象以使用using语句对它们进行包围,我想知道是否有一种快速方式告诉你所有声明的一次性对象。我的意思是像resharper或另一个visual studio插件。 谢谢。

如何使用`using`语句对方法进行unit testing?

如何为具有using语句的方法编写unit testing? 例如,假设我有一个方法Foo 。 public bool Foo() { using (IMyDisposableClass client = new MyDisposableClass()) { return client.SomeOtherMethod(); } } 我怎样才能测试上面的代码? 有时我选择不手动使用using语句和Dispose()对象。 我希望有人会告诉我一个我可以使用的技巧。

IDisisposable应该级联应用吗?

这是一个相当基本的问题,但我仍然在努力解决它。 当您希望在对象最终被垃圾回收之前允许对象的用户释放底层资源(例如套接字等)时,实现IDisposable。 当我有一个持有DbConnection(实现IDisposable)的类时,我的类是否也需要实现IDisposable并将调用链接到DbConnection或它拥有的任何其他IDisposable对象? 否则,只有当我的类是GarbageCollected时才会释放DbConnections资源,从而删除它对连接的引用,GC将完成DbConnection。

检测“泄露”的IDisposable对象

有很多问题要求如何检测IDisposable对象泄漏。 似乎答案是“你不能” 。 我只是检查了最简单的测试用例,FxCop 10.0没有这样做,带有MSVS2010的ReSharper 4没有这样做。 这对我来说似乎不对,比C中的内存泄漏更糟糕(至少我们已经建立了检测工具)。 我在想:是否有可能使用reflection和其他模糊的高级技术,我可以在运行时注入一个检查,在终结器中查看是否已调用Dispose ? WinDBG + SOS的魔术技巧怎么样? 即使没有现成的工具,我也想知道这在理论上是否可行(我的C#不是很尖锐)。 想法? 注意这个问题的标题可能会产生误导。 这里真正的问题应该是IDisposable对象是否已正确使用Disposed() 。 由于我认为这是一个错误,因此由GC处理并不重要。 编辑 :解决方案:.NET Memory Profiler完成工作。 我们只需要在程序结束时垃圾邮件几个GC.Collect() ,以使我们的探查器能够正确地获取统计数据。

未注册的事件处理程序会导致内存泄漏

我正在维护一个内存泄漏的Web应用程序。 基于我使用Red Gate ANTS内存分析器的调查,我很确定内存泄漏是由业务层中的事件处理程序引起的。 有一个集合在每个添加的项目上注册一个事件处理程序,以便集合可以在项目的日期更改时重新排序。 看来这个事件处理程序是罪魁祸首。 此应用程序的业务层非常复杂,因此将集合及其项目保留在内存中会拖拽其他一些对象。 我在集合上实现了IDisposable,并在Dispose方法中删除了事件处理程序: p.OnPunchDateChanged -= this.OnPunchDateChanged; 但是,实现IDisposable并没有帮助,因为我无法在using或try / catch块中包装对集合的所有引用。 此集合由我无法控制的应用程序部分使用。 如何清除这些事件处理程序以解决此内存泄漏?

为什么要调用Dispose()? 内存泄漏不会发生?

编辑 :我的问题是没有得到我正在寻找的主要答案。 我不清楚。 我真的想知道两件事: 不能调用Dispose()导致内存泄漏? 如果你有一个大型程序并且从不在任何IDisposable对象上调用Dispose(),那么最糟糕的事情是什么? 我的印象是,如果没有在IDisposable对象上调用Dispose()可能会发生内存泄漏。 根据这个post的讨论,我的看法不正确; 如果未调用Dispose()则不会发生内存泄漏。 为什么要打扰调用Dispose()呢? 是否只是立即释放资源,而不是以后的某个时间? 如果你有一个大型程序并且从不在任何IDisposable对象上调用Dispose() ,那么最糟糕的事情是什么?

调用Dispose()vs对象超出范围/方法完成

我有一个方法,里面有一个try / catch / finall块。 在try块中,我声明SqlDataReader如下: SqlDataReader aReader = null; aReader = aCommand.ExecuteReader(); 在finally块中,手动处理的对象是在类级别设置的对象。 那么实现IDisposable的方法中的对象,比如上面的SqlDataReader,它们会被自动处理掉吗? 在while循环执行后,在aReader上调用Close()以获取读取器的内容(应该是Dispose(),因为它调用Close())。 如果没有调用Close(),当方法完成或对象超出范围时,是否会自动关闭/处置此对象? 编辑:我知道using()语句,但有些情况让我感到困惑。 谢谢 谢谢

为什么CancellationTokenRegistration存在,为什么它实现IDisposable

我一直看到在CancellationTokenRegistration结果中使用Cancellation.Register和using子句的代码: using (CancellationTokenRegistration ctr = token.Register(() => wc.CancelAsync())) { await wc.DownloadStringAsync(new Uri(“http://www.hamster.com”)); } 我明白你应该确保你Dispose一个IDisposable ,但为什么它甚至实现IDisposable ? 它必须释放什么资源? 它认为平等的唯一方法。 如果您不Dispose它会发生什么? 你泄漏了什么?

如何正确实现IDisposable

在我作为开发人员的时候,我已经看到了很多C#代码,它试图通过将变量设置为null或者在类(例如DataSet)上调用Dispose()并在我自己的类Dispose()方法中帮助GC。一直在想是否需要在托管环境中实现它。 这个代码在设计模式中是浪费时间吗? class MyClass : IDisposable { #region IDisposable Members public void Dispose() { otherVariable = null; if (dataSet != null) { dataSet.Dispose(); } } #endregion }

在调用ReadAsStreamAsync时何时或何时调用HttpResponseMessage?

我使用System.Net.Http.HttpClient进行一些客户端HTTP通信。 我在一个地方得到了所有的HTTP,从其余的代码中抽象出来。 在一个实例中,我希望将响应内容作为流读取,但是流的使用者与HTTP通信发生的位置以及流被打开的情况很好地隔离。 在负责HTTP通信的地方,我正在处理所有的HttpClient内容。 在Assert.IsTrue(stream.CanRead)此unit testing将失败: [TestMethod] public async Task DebugStreamedContent() { Stream stream = null; // in real life the consumer of the stream is far away var client = new HttpClient(); client.BaseAddress = new Uri(“https://www.google.com/”, UriKind.Absolute); using (var request = new HttpRequestMessage(HttpMethod.Get, “/”)) using (var response = await client.SendAsync(request)) { response.EnsureSuccessStatusCode(); //here I […]