问题标签 [dispose]

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 投票
12 回答
105188 浏览

datatable - 我应该 Dispose() DataSet 和 DataTable 吗?

DataSet 和 DataTable 都实现了 IDisposable,因此,按照常规的最佳实践,我应该调用它们的 Dispose() 方法。

但是,从我目前所读到的内容来看,DataSet 和 DataTable 实际上没有任何非托管资源,因此 Dispose() 实际上并没有做太多事情。

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

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

那么,在我的所有数据集和数据表上调用 Dispose() 是否值得?

附录:

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

然而,这对于一个集合来说变得非常难看。例如,如果对 Dispose() 的调用之一引发异常,您会怎么做?你吞下它(这是“坏的”),以便你可以继续处理下一个元素吗?

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

0 投票
3 回答
1444 浏览

c# - 如何在匿名方法中释放/处置/销毁捕获的变量?

我正在使用匿名方法来处理 COM 对象中的事件。一旦程序终止,我在匿名方法中使用的资源似乎没有被“正确关闭”,因为我看到的每个资源都会出现第一次机会异常 (InvalidComObjectException)。我想这没什么大不了的,但感觉并不“正确”。

我无法理解在匿名方法范围之外访问那些捕获的变量的方法(无论如何,你不应该这样做)。如何在退出应用程序之前关闭/处置资源?

编辑:经过简短的重新阅读后,我可能不清楚我在这里做什么。我正在编写一个使用 COM 对象的托管应用程序。

进一步编辑:我正在使用ArcGIS Engine来操作 GIS 数据。在这种特殊情况下,我使用 ILayerEvents_Event 中的 VisibilityChanged 事件来监视 GIS 图层何时可见或不可见。该事件仅传递一个布尔值(可见或不可见)而不是图层名称,因此需要为每个图层创建一个方法来创建其可见性状态更改。由于我正在处理动态层,因此我需要一种以某种方式动态执行此操作的方法,因此需要匿名方法。

在 anonymoua 方法中,我有一个 ILayer 变量,它从外部循环(在 ILayer 上下文中)获取 ILayerEvents_Event,以便我知道我正在使用哪个层。正是在这一点上,我被困住了。在我退出应用程序之前,该功能正常工作,一切都很好,让这 20 多个引用挂在那里,无处可去,只有一个例外。

我不知道用户何时会最后一次隐藏/显示图层,因此无法在最后一次将内容归零。我想我可以保持原样(或者,也许有比匿名方法更好的方法),因为它似乎没有伤害任何东西。我只是觉得我错过了一些东西。

0 投票
4 回答
2428 浏览

c# - 处置表单时处置子表单的 WinForm

我有一个可以打开子表单的表单(带有ShowDialog)。我想确保在主表单完成后正确处理子表单。我尝试将子表单添加到components主表单的成员中,但此时我得到了一个ArgumentNullException.
我知道我可以实例化components我自己,但这不是有点危险吗?有一天,我将在设计器视图中添加一个组件,这将new Container()在 Designer.cs 文件中生成该行,我永远不会知道我有两个组件实例在堆周围运行。
是否有更简单的方法来确保正在处理子表单?

编辑 - 将我的解决方案移至答案

0 投票
1 回答
13060 浏览

c# - 有没有办法动态创建和处置 Webbrowser 控件?

我有这个使用 Webbrowser 控件进行自动浏览的应用程序。我需要想出一种方法来自动关闭浏览器(处置),然后创建另一个实际工作的实例。

这是我到目前为止的一些代码。

所以我在想如果我处理 webbrower 实例。

然后创建 webbrowser 对象的新实例。

不幸的是,这不起作用。浏览器的新实例不会显示,并且已处理的浏览器对象只是在 windows 窗体中保持冻结状态。

有什么我做错了吗?

谢谢

0 投票
1 回答
1597 浏览

c# - IDisposable 如何在 .Net 1.1 中的 FileStream 上实现

这似乎是一个点头的问题,但我正在看这个,因为我听到有人声称你必须在 FileStream 上调用 Close(),即使它在 using 块中(并且他们有调用 Close() 的代码就在街区的尽头)。

我知道 Close() 是为了调用 Dispose(),但我想我会看得更深,因为这是 .Net 1.1 代码,而且我的大部分经验都是在 2.0 上进行的。

让我印象深刻的一件事是,FileStream 的 MSDN 文档具有适用于 .Net 2.0 的 Dispose() 和 Dispose(bool),但只有适用于 .Net 1.1 的 Dispose(bool)。

我认为这可能是一个疏忽,所以我使用 Reflector 来查看一个程序集——在那里,我也看到了 Dispose(bool),但没有看到 Dispose()。

它是否正确?如果是这样,这里的故事是什么?FileStream 在 using 块中工作——我认为这意味着它必须实现 IDisposable,据我所知,它只声明了 Dispose()。

是否发生了一些编译器魔术,或者我在某处缺少 Dispose() 的隐藏实现(大概调用 Dispose(true) 或 Dispose(false) ?)

最后(没有双关语),您能否确认在 using 块中确定 FileStream 的范围将在 .Net 1.1 的范围退出时关闭流?

[编辑]

澄清一下,这是 C# 代码。我知道 VB.Net 直到 .Net 2.0 才得到 using 语句,但我的理解是 C# 在 1.1 中有它(我的 1.1 代码有它并编译)

0 投票
2 回答
3311 浏览

c# - 从强制 IE 会话关闭应用程序

我的问题是:“这可以做得更好吗?” 如果是这样,如何?有任何想法吗?

我们需要从一个“不可见的”C# .NET 3.5 应用程序中启动一个捕获的 IE 会话,并在处理某个请求后退出 IE 会话和“父”应用程序。

过去一周左右我一直在处理这个问题......今天早上我终于找到了我认为是一个强大的解决方案;但我有点 C# 菜鸟(虽然我已经做了 10 年的专业程序员),所以我正在寻求第二或第三意见;以及任何其他选项、​​批评、建议或评论......特别是:SHDocVw 仍然是创建“俘虏但不嵌入”Internet Explorer 会话的首选方法吗?

正如我所看到的,棘手的一点是处理非托管InternetExplorerApplicationCOM 对象,所以我将它包装在一个IDisposable名为的类中InternetExplorer

我的基本做法是:

  1. Application.Run MyApp,它是一个ApplicationContext,并且是IQuitable。
    • 我认为在我们等待 IE 请求时需要一个应用程序来保持程序打开?
    • 我想也许(非守护程序)侦听器循环线程也可以工作?
  2. MyApp 的构造函数创建一个新的InternetExporer对象,并传递 (IQuitable)this
  3. InternetExporer的构造函数启动一个新的 IE 会话,并将其导航到一个 URL。
  4. 当请求某个 URL 时,InternetExporer回调“父母”退出方法。

背景:

真实的故事是:我正在为MapInfo(一个GIS客户端)编写一个插件。该插件劫持从 IE 到服务器的“开始提取”HTTP 请求,稍微修改 URL 并在其位置发送 HTTPRequest。我们将 respose XML 解析为MIF 文件[PDF 196K],然后我们将其导入并在 MapInfo 中打开。然后我们退出 IE 会话,并关闭“插件”应用程序。

SSCCE

0 投票
4 回答
12365 浏览

c# - C# 处理方法

我在使用 C# 的“Dispose”模式时遇到了困难。我在这里有 3 个类:一个管理类、一个表单和一个数据存储类。

管理类可以(如果需要)使用表单来提示用户输入。表单从文件中加载数据,然后用户可以对其进行修改。关闭时,表单必须保存此数据。数据存储类实现了 .Dispose(),它就是这样做的 - 将更改写入磁盘。

由于此数据存储类 (StoredInfo) 是表单 (MyForm) 的成员,因此 MyForm 还必须实现 .Dispose() 以便调用 StoredInfo.Dispose。这就是给我带来问题的原因。我的管理类,在它的代码中:

我的表格:

...但从未调用过 Form.Dispose() 方法。使用调试器,执行如下:

我们不知何故从未调用过 .Dispose,而是调用了 .Dispose(bool)。在 C++ 中,参数可以有默认值,我可以看到这一点,但在 C# 中,我迷路了。我最好的猜测是我的调试器没有向我展示实际发生的事情。

现在,查看类层次结构,我看到其他实现 IDisposable 的类 - 所以某处必须有另一个 Dispose() 成员。它不是虚拟的,所以我不确定为什么我没有收到编译器错误。我尝试覆盖 .Dispose(bool) 方法,因为它被调用,并且虚拟的,但是这样:

我得到“类型'ConnectorForm'已经定义了一个具有相同参数类型的名为'Dispose'的成员”,是的,我想它确实......在Designer's code中。所以这不是一个选择。所以回到调用 Dispose()。但是怎么做?目前,我正在怀念 C++ 析构函数的纯粹简单、强大和确定性

0 投票
7 回答
7597 浏览

c# - 如何处理调用了异步方法的对象?

我有这个PreloadClient实现的对象IDisposable,我想处理它,但是在异步方法完成它们的调用之后......这没有发生

那么,有什么想法或解决方法吗?

0 投票
2 回答
1570 浏览

jquery - jQuery是否在窗口卸载时自动处理事件

例如在我有的页面上

我是否还需要添加取消绑定代码 - 还是 jQuery 会自动为我执行此操作?

0 投票
3 回答
2512 浏览

c# - SharePoint SPSite 处理

我的场景是在 SPJobDefinition 的 Execute 方法中,我想遍历 Web 应用程序中的每个 SPSite。所以我有以下代码:

问题是,我需要处理每个站点吗?我通常遵循的规则是仅在我自己新建时才将其处理或放入 using 中。Sites 属性是否实际上包含完整构造的站点对象,我将在此代码中仅引用它。如果是这样,那么处置这些站点将是危险的,因为我正在修改另一个可能需要它们的对象。或者相反的是 Sites 属性是否根据请求构造对象。在这种情况下,我有责任处理它们吗?

另外,如果我确实需要这样做,我该如何处理它们。在这种情况下我不能使用 using ,并且在 foreach 中调用 dispose 会破坏枚举吗?