问题标签 [disposable]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
6 回答
3740 浏览

c# - 终结器和处置

我有一个名为的类BackgroundWorker,它有一个不断运行的线程。要关闭这个线程,一个名为stopto 的实例变量需要是true.

为了确保在使用完类时释放线程,我添加IDisposable了一个调用Dispose(). 假设stop = true确实会导致该线程退出,那么这个 sippet 是否正确?Dispose从终结器调用很好,对吗?

Dispose如果object继承,终结器应该总是调用IDisposable,对吗?

0 投票
3 回答
1082 浏览

inversion-of-control - ServiceContainer、IoC 和一次性对象

我有一个问题,我要标记这个主观的,因为这就是我认为它演变成的,更多的讨论。我希望有一些好的想法或一些发人深省的东西。对于这个冗长的问题,我深表歉意,但您需要了解上下文。

问题基本上是:

  • 您如何处理与 IoC 容器相关的具体类型?具体来说,谁负责处理它们,如果它们需要处理,以及这些知识如何传播到调用代码?

您是否要求它们是 IDisposable 的?如果不是,那么该代码是面向未来的,还是您不能使用一次性物品的规则?如果您对接口和具体类型强制执行 IDisposable 要求以保证未来的发展,那么作为构造函数调用的一部分注入的对象是谁的责任?


编辑:我接受了@Chris Ballard的答案,因为它与我们最终采用的方法最接近。

基本上,我们总是返回一个看起来像这样的类型:

然后我们从 .Resolve 和 .TryResolve 返回一个实现这个接口的对象,这样我们在调用代码中得到的总是相同的类型。

现在,实现此接口的对象IService<T>是 IDisposable 的,并且应该始终被释放。解决服务的程序员不能决定是否IService<T>应该释放对象。

然而,这是关键部分,无论服务实例是否应该被释放,这些知识都被嵌入到实现的对象IService<T>中,所以如果它是一个工厂范围的服务(即每次调用 Resolve 最终都会得到一个新的服务实例),那么服务实例会在IService<T>对象被释放的时候被释放。

这也使得支持其他特殊范围成为可能,例如池。我们现在可以说我们需要最少 2 个服务实例,最多 15 个,通常是 5 个,这意味着每次调用 .Resolve 都会从可用对象池中检索一个服务实例,或者构造一个新实例。然后,当IService<T>持有池化服务的对象被释放时,服务实例被释放回其池中。

当然,这使所有代码看起来像这样:

但这是一种干净的方法,并且无论使用的服务类型或具体对象如何,它都具有相同的语法,因此我们选择它作为可接受的解决方案。


原始问题如下,供后代使用


冗长的问题来了:

我们有一个我们使用的 IoC 容器,最近我们发现了问题所在。

在非 IoC 代码中,当我们想使用文件时,我们使用了这样的类:

毫无疑问,该类是否具有有限资源,因为我们知道文件必须关闭,并且该类本身实现了 IDisposable。规则很简单,我们构造一个对象的每个类,实现 IDisposable,都必须被处理掉。无话可问。调用 Dispose 是否是可选的不是由此类的用户决定的。

好的,接下来就是迈向 IoC 容器的第一步。假设我们不希望代码直接与文件对话,而是通过一层间接。让我们将此类称为此示例的 BinaryDataProvider。在内部,该类正在使用一个流,它仍然是一个一次性对象,因此上面的代码将更改为:

这变化不大。类实现IDisposable的知识还在,不问,需要调用Dispose。

但是,让我们假设我们的类提供的数据现在不使用任何有限的资源。

那么上面的代码可以写成:

好的,到目前为止一切都很好,但问题的关键来了。假设我们想要使用 IoC 容器来注入此提供程序,而不是依赖于特定的具体类型。

代码将是:

请注意,我假设有一个独立的接口可用,我们可以通过它访问对象。

有了上面的改动,如果我们以后想要使用一个真正应该被处理掉的对象怎么办?解析该接口的现有代码都没有被编写来处理该对象,那么现在怎么办?

在我们看来,我们必须选择一种解决方案:

  • 实现运行时检查,检查是否正在注册的具体类型实现 IDisposable,要求它公开的接口也实现 IDisposable。这不是一个好的解决方案
  • 在对正在使用的接口进行约束之前,它们必须始终从 IDisposable 继承,以便面向未来
  • 强制运行时没有具体类型可以是 IDisposable,因为这不是由使用 IoC 容器的代码专门处理的
  • 只需让程序员检查对象是否实现 IDisposable 并“做正确的事”?
  • 还有其他人吗?

另外,在构造函数中注入对象呢?我们的容器以及我们研究过的其他一些容器能够将新对象注入到具体类型的构造函数的参数中。例如,如果我们BinaryDataProvider需要一个实现ILogging接口的对象,如果我们对这些对象强制执行 IDispose-“能力”,那么处理日志对象的责任是谁的?

你怎么看?我想要意见,好的和坏的。

0 投票
3 回答
62172 浏览

c# - 将对象设置为 null vs Dispose()

我对 CLR 和 GC 的工作方式很着迷(我正在努力通过 C# 阅读 CLR、Jon Skeet 的书籍/帖子等来扩展我的知识)。

无论如何,说:

或者,通过让 MyClass 实现 IDisposable 和析构函数并调用 Dispose()?

另外,如果我有一个带有 using 语句的代码块(例如下面),如果我单步执行代码并退出 using 块,那么对象是在那时被处置还是在发生垃圾回收时被处置?如果我在 using 块中调用 Dispose() 会发生什么?

流类(例如 BinaryWriter)有 Finalize 方法吗?我为什么要使用它?

0 投票
3 回答
2632 浏览

api - 查找一次性电子邮件地址

我一直在使用 undisposable.net 的 API 来查找一次性电子邮件地址,但注意到该站点似乎不再可用。

有谁知道他们怎么了?是否有任何其他网站为一次性电子邮件地址域提供 API,或者是否有可以下载的列表进行检查?

编辑:澄清:我不想创建一次性电子邮件地址。我想检查注册表中提交的电子邮件地址是否是一次性的。

0 投票
6 回答
2144 浏览

c# - C# IDisposable 问题

我有以下代码示例:

现在——真的很糟糕吗?我不确定,但这似乎与不标记基类 virtual in 的析构函数C++非常相似。

我不想让IRepository接口实现IDisposable,因为这会带来不必要的复杂性和一堆也必须实现的类IDisposable


这种情况应该如何处理?

我确信这可能发生在任何类型层次结构中 - 当派生类型之一必须管理一次性资源时。

那么我应该怎么做 - 拉到IDisposable第一个界面或保留它并希望用户区分一次性和非一次性存储库?

谢谢你。

0 投票
6 回答
10237 浏览

c# - C# 一次性对象

关于我应该如何处理IDisposable对象序列有一些建议吗?

例如,我有一个构建IEnumerable<System.Drawing.Image>序列的方法,在某些时候我需要手动处理这些对象,否则可能会导致一些泄漏。

现在,有没有办法将Dispose()调用绑定到垃圾收集器操作,因为我希望这些对象在它们不再可以从其他代码部分访问的那一刻被立即处理?

**或者你可以建议我一些其他的方法?**


通常,这似乎与它出现的问题相同,例如,在 unmanaged C++without shared pointers中,您可以有一个方法:

如果您不使用代码合同或未在评论中说明某些内容,那么您无法确定何时处置它。

我想一次性物品的情况也差不多,但我希望有一个合适的解决方案。

0 投票
6 回答
2033 浏览

c# - C#一次性问题

例如,如果我忘记写语句,垃圾收集器会自动释放与某个实例关联的非托管资源(实际上是什么) ?IDisposableusing

显然,我不知道什么时候会发生这种情况IDisposable,但是GC当我不关心这些资源并且我可以接受它们最终会被处置时,可以吗?

0 投票
1 回答
1101 浏览

c# - 实体框架的这种实现是否会泄漏内存?

当在 Web 应用程序或控制台应用程序的 using 语句中使用时,我无法确定实体上下文是否在使用流程中进行了处理。

谢谢!

0 投票
1 回答
61 浏览

performance - 为什么我应该在 DataContainer 或 DataContext 上调用 Dispose,而它看起来并没有什么不同?

我创建了一个简单的测试程序来找出调用 Dispose 与不调用 DataContainer 对象之间的内存和速度差异。

这是我的测试程序:

两种方法的结果相同。我的 PC 上的结果是大约 27.22 秒和大约 37.7 MB 的私有内存大小。

现在为什么我应该为 DataContainers 调用 Dispose 而它没有区别?

提前致谢。

0 投票
0 回答
354 浏览

ffmpeg - 解码 H.263 Sorenson Spark D 帧的问题

我正在尝试使用 avcodec_decode_video 函数解码 H.263 sorenson 类型的数据。

它能够解码 I 和 P 帧,但我的数据中有一些 D 帧(一次性帧间),并且此函数无法解码这些帧,并且返回值为零。

所以,有人能告诉我我们如何解码这些 f 型帧,因为我也没有发现 ENUM 值中提到的 D 帧。

我在某处读过我们可以将 D 帧转换为 P 帧,但是如果我们有原始数据,如果我们想直接使用解码功能,我们如何实现这一点。