Questions tagged «dispose»

执行与释放,释放或重置非托管资源相关的应用程序定义的任务


15
完成与处置
为什么有些人会使用该Finalize方法而不是Dispose方法? 在哪种情况下,您将使用该Finalize方法而不是该Dispose方法?
215 c#  dispose 


10
我应该Dispose()DataSet和DataTable吗?
DataSet和DataTable都实现IDisposable,因此,按照常规的最佳实践,我应该调用它们的Dispose()方法。 但是,到目前为止,从我读过的内容来看,DataSet和DataTable实际上没有任何非托管资源,因此Dispose()实际上并没有做什么。 另外,我不能仅仅using(DataSet myDataSet...)因为DataSet有DataTables的集合而使用。 因此,为了安全起见,我需要遍历myDataSet.Tables,处置每个DataTable,然后处置DataSet。 因此,值得在我所有的DataSet和DataTable上调用Dispose()的麻烦吗? 附录: 对于那些认为应该处置DataSet的用户:通常,处置模式是使用using或try..finally,因为您要保证将调用Dispose()。 但是,对于集合而言,这很快变得很难看。例如,如果对Dispose()的调用之一抛出异常,该怎么办?您是否吞下了它(这是“不好的”),以便您可以继续处理下一个元素? 或者,您是否建议我只调用myDataSet.Dispose(),而忘记将DataTables放置在myDataSet.Tables中?

7
如何防止IDisposable传播到您的所有班级?
从这些简单的类开始... 假设我有一组简单的类,如下所示: class Bus { Driver busDriver = new Driver(); } class Driver { Shoe[] shoes = { new Shoe(), new Shoe() }; } class Shoe { Shoelace lace = new Shoelace(); } class Shoelace { bool tied = false; } A Bus有一个Driver,A 有Driver两个Shoe,每个Shoe都有一个Shoelace。一切都很傻。 将IDisposable对象添加到Shoelace 后来我决定对进行某些操作Shoelace可以是多线程的,因此我EventWaitHandle为线程添加了一个与之通信。所以Shoelace现在看起来像这样: class Shoelace { private …

9
垃圾收集器会打给IDisposable.Dispose给我吗?
.NET IDisposable模式 意味着,如果编写终结器并实现IDisposable,则终结器需要显式调用Dispose。这是合乎逻辑的,这是我在需要终结器的极少数情况下一直要做的事情。 但是,如果我这样做,会发生什么: class Foo : IDisposable { public void Dispose(){ CloseSomeHandle(); } } 并且不要实现终结器或其他任何东西。框架会为我调用Dispose方法吗? 是的,我意识到这听起来很愚蠢,所有逻辑都暗示这不会,但是我总是有两件事让我不确定。 几年前有人告诉我,实际上它会这样做,而且那个人在“知道自己的东西”方面有着非常可靠的记录。 编译器/框架根据您实现的接口(例如:foreach,扩展方法,基于属性的序列化等)来执行其他“魔术”操作,因此这也可能是“魔术”的。 尽管我已经阅读了很多有关此方面的内容,并且暗示了很多内容,但我始终无法找到该问题的明确答案“是”或“否”。

3
不对TPL Task对象调用Dispose()是否可以接受?
我想触发任务在后台线程上运行。我不想等待任务完成。 在.net 3.5中,我应该这样做: ThreadPool.QueueUserWorkItem(d => { DoSomething(); }); 在.net 4中,建议使用TPL。我看到的推荐的常见模式是: Task.Factory.StartNew(() => { DoSomething(); }); 但是,该StartNew()方法返回一个Task实现的对象IDisposable。推荐这种模式的人似乎忽略了这一点。有关该Task.Dispose()方法的MSDN文档说: “在释放对任务的最后引用之前,请始终致电Dispose。” 您不能在任务完成之前对其进行调用处置,因此让主线程等待并进行调用处置首先会破坏在后台线程上执行任务的目的。似乎也没有任何可用于清理的完成/完成事件。 Task类的MSDN页面没有对此发表评论,而《 Pro C#2010 ...》这本书推荐了相同的模式,并且对任务处理没有评论。 我知道如果我只留下它,终结器最终会抓住它,但是当我做很多工作而忘了像这样的任务而终结器线程不堪重负时,这会回来咬我吗? 所以我的问题是: 是否可以接受不叫Dispose()就Task在这种情况下类?如果是这样,为什么而且存在风险/后果? 有没有讨论这个的文档? 还是有适当的方法来处理Task我错过的对象? 还是有另一种通过TPL做事忘了任务的方法?

7
处置WPF用户控件
我已经创建了一个供第三方使用的自定义WPF用户控件。我的控件有一个私有成员,该成员是可抛弃的,并且我想确保一旦包含窗口/应用程序关闭,它的dispose方法将始终被调用。但是,UserControl不是一次性的。我尝试实现IDisposable接口并订阅Unloaded事件,但是在主机应用程序关闭时都未调用。如果有可能,我不想依靠控件的使用者记住要调用特定的Dispose方法。 public partial class MyWpfControl : UserControl { SomeDisposableObject x; // where does this code go? void Somewhere() { if (x != null) { x.Dispose(); x = null; } } } 到目前为止,我发现的唯一解决方案是订阅Dispatcher的ShutdownStarted事件。这是合理的方法吗? this.Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted;
119 c#  .net  wpf  user-controls  dispose 

5
有什么方法可以关闭StreamWriter而不关闭其BaseStream吗?
我的根本问题是,在using调用Dispose时StreamWriter,它还会处理BaseStream(与相同的问题Close)。 我有一个解决方法,但是如您所见,它涉及复制流。有什么方法可以做到不复制流? 这样做的目的是将字符串的内容(最初是从数据库中读取)放入流中,以便第三方组件可以读取该流。 注意:我无法更改第三方组件。 public System.IO.Stream CreateStream(string value) { var baseStream = new System.IO.MemoryStream(); var baseCopy = new System.IO.MemoryStream(); using (var writer = new System.IO.StreamWriter(baseStream, System.Text.Encoding.UTF8)) { writer.Write(value); writer.Flush(); baseStream.WriteTo(baseCopy); } baseCopy.Seek(0, System.IO.SeekOrigin.Begin); return baseCopy; } 用作 public void Noddy() { System.IO.Stream myStream = CreateStream("The contents of this string are …
117 c#  stream  dispose 


7
在C#中使用IDisposable和析构函数有什么区别?
什么时候在类而不是析构函数上实现IDispose?我读了这篇文章,但是我仍然没有抓住重点。 我的假设是,如果我在对象上实现IDispose,则可以显式地“销毁”该对象,而不是等待垃圾回收器执行此操作。这样对吗? 这是否意味着我应该始终在对象上显式调用Dispose?常见的例子有哪些?
101 c#  .net  dispose  destructor 


2
析构,配置和完成方法之间的区别
我正在研究垃圾收集器在C#中的工作方式。我很困惑在使用Destructor,Dispose和Finalize方法。 根据我的研究和理解,在我的类中具有Destructor方法将告诉垃圾收集器以destructor方法中提到的方式执行垃圾收集,而该方法不能在类的实例上显式调用。 该Dispose方法旨在为用户提供控制垃圾收集的功能。该Finalize方法释放类使用的资源,但不释放对象本身。 我不确定我是否理解正确。请澄清怀疑。欢迎任何其他链接或指南。

1
我是否需要考虑处置我使用的任何IEnumerable <T>?
它最近向我指出,各种LINQ的扩展方法(如Where,Select等)返回IEnumerable&lt;T&gt;,恰巧也有IDisposable。以下评估为True new int[2] {0,1}.Select(x =&gt; x*2) is IDisposable 我是否需要处理Where表达式的结果? 每当我调用返回的方法时,完成操作后IEnumerable&lt;T&gt;,我是否(潜在地)承担对处置的责任?
70 c#  linq  ienumerable  dispose 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.