标签: dispose

你需要处理对象并将它们设置为null吗?

您是否需要处理对象并将它们设置为null,或者当垃圾收集器超出范围时它们是否会将它们清理干净?

.net c# garbage-collection dispose

300
推荐指数
9
解决办法
27万
查看次数

完成vs Dispose

为什么有些人在Finalize方法上使用该Dispose方法?

在什么情况下你会使用Finalize方法而不是Dispose方法,反之亦然?

c# dispose

207
推荐指数
8
解决办法
13万
查看次数

我应该Dispose()DataSet和DataTable吗?

DataSet和DataTable都实现了IDisposable,因此,通过传统的最佳实践,我应该调用它们的Dispose()方法.

但是,从我到目前为止所读到的,DataSet和DataTable实际上并没有任何非托管资源,因此Dispose()实际上并没有做太多.

另外,我不能只使用,using(DataSet myDataSet...)因为DataSet有一组DataTables.

所以,为了安全起见,我需要遍历myDataSet.Tables,处理每个DataTable,然后处理DataSet.

那么,在我的所有DataSet和DataTables上调用Dispose()是否值得麻烦?

附录:

对于那些认为应该处理DataSet的人:通常,处理的模式是使用usingor try..finally,因为你想保证将调用Dispose().

然而,这对于一个集合来说真的很快.例如,如果对Dispose()的一个调用抛出异常,你会怎么做?你吞下它(这是"坏"),以便你可以继续处理下一个元素?

或者,你是否建议我只调用myDataSet.Dispose(),而忘记在myDataSet.Tables中处理DataTables?

datatable dispose idisposable using dataset

187
推荐指数
7
解决办法
10万
查看次数

在使用块的中间返回

就像是:

using (IDisposable disposable = GetSomeDisposable())
{
    //.....
    //......
    return Stg();
}
Run Code Online (Sandbox Code Playgroud)

我相信这不是回报声明的合适地方,是吗?

c# dispose idisposable using-statement

183
推荐指数
6
解决办法
4万
查看次数

你如何防止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;
}
Run Code Online (Sandbox Code Playgroud)

A Bus有一个Driver,Driver有两个Shoe,每个Shoe有一个Shoelace.一切都很傻.

将一个IDisposable对象添加到Shoelace

后来我决定对它进行一些操作Shoelace可能是多线程的,所以我添加了一个EventWaitHandle用于与之通信的线程.所以Shoelace现在看起来像这样:

class Shoelace
{
    private AutoResetEvent waitHandle = new AutoResetEvent(false);
    bool tied = false;
    // ... other stuff .. …
Run Code Online (Sandbox Code Playgroud)

.net c# garbage-collection dispose idisposable

137
推荐指数
3
解决办法
7614
查看次数

垃圾收集器是否会为我调用IDisposable.Dispose?

.NET IDisposable Pattern 意味着如果您编写终结器并实现IDisposable,则终结器需要显式调用Dispose.这是合乎逻辑的,而且在极少数情况下我总是会做终结器的保证.

但是,如果我这样做会发生什么:

class Foo : IDisposable
{
     public void Dispose(){ CloseSomeHandle(); }
}
Run Code Online (Sandbox Code Playgroud)

并且不要实现终结器或任何东西.框架会为我调用Dispose方法吗?

是的,我意识到这听起来很愚蠢,而且所有的逻辑都暗示它不会,但我总是有两件事让我不确定.

  1. 几年前有人曾告诉我,事实上它会这样做,而且那个人有"非常了解他们的东西"的良好记录.

  2. 编译器/框架根据您实现的接口(例如:foreach,扩展方法,基于属性的序列化等)执行其他"神奇"操作,因此这也可能是"魔术".

虽然我已经阅读了很多关于它的内容,并且有很多暗示的内容,但我从来没有能够找到这个问题的肯定是或否答案.

.net dispose idisposable

126
推荐指数
5
解决办法
3万
查看次数

不在TPL Task对象上调用Dispose()是否可以接受?

我想触发一个在后台线程上运行的任务.我不想等待任务完成.

在.net 3.5中,我会这样做:

ThreadPool.QueueUserWorkItem(d => { DoSomething(); });
Run Code Online (Sandbox Code Playgroud)

在.net 4中,TPL是建议的方式.我见过的常见模式是:

Task.Factory.StartNew(() => { DoSomething(); });
Run Code Online (Sandbox Code Playgroud)

但是,该StartNew()方法返回一个Task实现的对象IDisposable.推荐这种模式的人似乎忽视了这一点.有关该Task.Dispose()方法的MSDN文档说:

"在释放对任务的最后一个引用之前,始终调用Dispose."

你不能在任务完成之前调用dispose,所以让主线程等待并调用dispose会首先打破后台线程上的操作.似乎也没有任何已完成/已完成的事件可用于清理.

Task类上的MSDN页面没有对此进行评论,并且"Pro C#2010 ..."一书推荐了相同的模式,并且没有对任务处理做出评论.

我知道如果我离开它,终结者最终会抓住它,但当我做了大量的火灾并且忘记了这样的任务并且终结者线程被淹没时,它会回来咬我吗?

所以我的问题是:

  • 是否可以接受不叫Dispose()Task在这种情况下类?如果是这样,为什么会有风险/后果?
  • 有没有讨论这个的文件?
  • 或者是否有适当的方法来处理Task我错过的物体?
  • 或者是否有其他方法可以使用TPL执行解雇和忘记任务?

.net c# multithreading dispose task-parallel-library

117
推荐指数
2
解决办法
2万
查看次数

处置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;
         }

     }
 }
Run Code Online (Sandbox Code Playgroud)

到目前为止,我找到的唯一解决方案是订阅Dispatcher的ShutdownStarted事件.这是一种合理的方法吗?

this.Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted;
Run Code Online (Sandbox Code Playgroud)

.net c# wpf user-controls dispose

114
推荐指数
5
解决办法
9万
查看次数

如果我在使用声明结束之前返回会发生什么?处理是否会被召唤?

我有以下代码

using(MemoryStream ms = new MemoryStream())
{
     //code
     return 0;
}
Run Code Online (Sandbox Code Playgroud)

dispose()using语句括号结束时调用该方法}对吗?由于我 returnusing声明结束之前,MemoryStream对象是否会被妥善处理?这里发生了什么?

.net c# dispose idisposable using-statement

112
推荐指数
2
解决办法
3万
查看次数

有没有办法在不关闭BaseStream的情况下关闭StreamWriter?

我的根本问题是,当using调用Disposea时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;
}
Run Code Online (Sandbox Code Playgroud)

用作

public void Noddy()
{
    System.IO.Stream myStream = CreateStream("The contents of this string are unimportant");
    My3rdPartyComponent.ReadFromStream(myStream);
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,我正在寻找一个名为的假想方法BreakAssociationWithBaseStream,例如

public System.IO.Stream CreateStream_Alternate(string value)
{
    var baseStream = new System.IO.MemoryStream();
    using (var writer …
Run Code Online (Sandbox Code Playgroud)

c# dispose stream

107
推荐指数
4
解决办法
4万
查看次数