问题标签 [object-lifetime]

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 投票
1 回答
85 浏览

java - 对活动的长期引用 - 生命周期

假设我有一个单例类(Downloader)负责下载和保存文件。当客户端请求下载时,他还必须提供回调。我的问题是关于那些回调对象的存储。

如果我有一个实现回调接口的 Activity,然后请求多个大下载,Downloader 类将无限期地持有对该 Activity 的引用。如果在下载完成之前请求它们的 Activity 经历了它的生命周期并被销毁怎么办。

在这种情况下,Downloader 将阻止回收器对 Activity 进行垃圾收集。我不介意请求的下载继续。然而,我想做的是以某种方式检测应该收集提供的回调,并且我实际上正在泄漏它。

有这样的设计模式吗?我在想其中一个Reference子类会很有用。

谢谢。

0 投票
1 回答
737 浏览

aop - Spring.NET 是否支持创建自定义对象生命周期?

在.NET 中的依赖注入一书中,作者说 Spring.NET 不支持创建自定义对象生命周期(参见第 12.2 节 [管理生命周期] 的最后一段)。

即使我是该框架的新手,我认为情况可能并非如此。根据我目前的研究,我认为可以通过实现 ITargetSource 接口来定义自定义生命周期,但可以说,这个接口可以做的远不止这些(比如一些预定义的实现包括对象池和热交换目标等)。

我的理解正确吗?如果是,创建和配置自定义生命周期的确切逻辑步骤是什么?如果不是,如何在 Spring.NET 中创建自定义对象生命周期?

0 投票
3 回答
1897 浏览

c# - 拥有一个手动打开和关闭数据库连接的存储库是不好的做法吗?

环境:ASP.NET MVC3 C#

假设我有一些存储库(半伪):

然后在控制器中注入存储库并按如下方式使用以手动控制数据库连接生存期:

这是否被认为是不好的做法,因为它正在从存储库控制连接并将其放置在控制器中?我担心使用依赖注入会导致内存泄漏,并希望确保不会打开重复的连接,也不会长时间运行和未使用。

0 投票
2 回答
3426 浏览

c++ - 引用相对于其目标的生命周期

为了阻止我最近给出的答案的评论中发生的争论,我想对以下问题提供一些建设性的答案:

  1. 引用的生命周期与它所引用的对象不同吗?引用只是其目标的别名吗?
  2. 引用能否在格式良好的程序中超过其目标而不会导致未定义的行为?
  3. 如果为原始对象分配的存储被重用,是否可以引用新对象?
  4. 以下代码是否在不调用未定义行为的情况下演示了上述几点?

Ben Voigt的示例代码并简化(在ideone.com上运行):

0 投票
4 回答
436 浏览

c++ - 使用 boost 的 shared_ptr 管理 C 类型生命周期?

我有一个类似于How to manage object life time using Boost library smart pointers 的问题?但是,就我而言,“对象”根本不是 C++ 对象,而是从 C API 返回/传递的不透明类型。该类型没有指针语义,即没有解引用;但是,它作为参数传递给 C API 中的其他函数。该类型还有一个明确的closeAPI,必须调用它才能清理内部资源。

所以,我有一个类似的 C API

由于各种原因,在我的 C++ 代码中,我想管理 opaque_legacy_type_t 的“实例”,就像管理堆分配的对象实例一样,即具有与boost::shared_ptr<>. 似乎提供了足够的东西,我可以通过这样做shared_ptr来管理调用:XXclose

但是,由于opaque_legacy_type_t没有指针语义,所以使用managed有点笨拙。

我想做的是有类似于 a 的东西managed_typeshared_ptr并且正在寻找不需要我全部写出来的想法。

编辑: 我在示例中纠正了我原来的错误。遗留 API 通过值而不是指针来获取不透明类型。

0 投票
5 回答
4055 浏览

c# - 使用生命周期范围时如何处理运行时参数?

警告,前方长篇大论。

我最近一直在思考这个问题,我正在努力在这里找到一个令人满意的解决方案。我将使用 C# 和 autofac 作为示例。

问题

IoC 非常适合构建大型无状态服务树。我解析服务并将数据仅传递给方法调用。伟大的。

有时,我想将数据参数传递给服务的构造函数。这就是工厂的用途。我没有解析服务,而是解析了它的工厂并使用参数调用 create 方法来获取我的服务。更多的工作,但还可以。

有时,我希望我的服务在一定范围内解析到同一个实例。Autofac 提供了InstancePerLifeTimeScope()非常方便的功能。它允许我始终解析到执行子树中的同一个实例。好的。

有时我想将这两种方法结合起来。我想要构造函数中的数据参数并有实例范围。我还没有找到令人满意的方法来实现这一点。

解决方案

1.初始化方法

无需将数据传递给构造函数,只需将其传递给Initialize方法。

界面:

班级:

登记:

用法:

在第一次解析服务并调用 Initialize 后,我可以愉快地在相同的上下文中解析并获得相同的初始化实例。我不喜欢这样一个事实,即在调用之前Initialize我有一个无法使用的对象。在我调用 Initialize() 之前,存在实例将被解析并在其他地方使用的危险。

2.持有人模式

这是一种保存对数据对象的引用的模式,而不是注入数据对象本身,而是注入持有者对象。

界面:

班级:

登记:

用法:

当我将持有实例的责任转移到不同的类时,这会好一些。我现在也可以在其他服务中使用该持有人。另一个优点是我可以在必要时热交换持有人中的数据。我不喜欢它混淆代码并添加另一个我必须在测试期间模拟的接口的事实。

3.让容器持有实例

界面:

班级:

登记:

用法:

这是正确的。我不会在任何地方存储工厂调用的结果,因为 autofac 会为我存储它。这对于任何会阅读代码的人来说都是非常令人惊讶的。我不确定 autofac 是否甚至打算像这样使用。这样做的好处是我既不需要额外的初始化方法,也不需要额外的类来保存实例。

问题

你对此有什么看法?您如何处理运行时数据参数和生命周期范围的情况?我错过了更好的方法吗?

0 投票
1 回答
1853 浏览

.net - AppDomain 仅部分尊重 InitializeLifetimeService(如果有的话)

感谢Timiz0r,我已经解决了这个问题,但它是多步骤的,所以我在这里详细介绍了完整的解决方案;原始问题如下。首先,我将 ILS 函数更改为:

然后我将它包含在我的Program以及A中。正如Timiz0r指出的那样,Form继承MarshalByRefObject,所以我不必在我的主类(已经继承Form)中包含 Inherits 语句。这是一件大事,因为我最初没有包含它。接下来,我将 AppDomain 设置更改为:

通过这些更改,我现在可以根据需要使用 DLL COM 对象的单独实例。

原始问题


我正在编写一个应用程序,它创建一个对象列表,每个对象都引用一个 DLL,每个对象都放在自己的 AppDomain 中,以防止 DLL 的实例相互干扰。采取另一种方式:

  1. 程序维护一个List(Of A)
  2. A使用CreateInstanceAndUnwrap创建为AppDomain的实例
  3. 每个A引用mirror.dll,它包含在应用程序的引用中

除了在设置域时,对 InitializeLifetimeService 的调用不被尊重之外,所有这一切都很好。在等待默认的 5 分钟并调用我的一个 A 后,我收到 RemoteException 错误。但是,放入一些 Try/Catch 语句后,我发现我可以到达有问题的 A,但是当它尝试 RaiseEvent 时它失败了。此外,似乎 DLL 对象本身已被删除(或者在尝试 RaiseEvent 时它也会失败,它经常这样做)。

根据这篇文章,AppDomain 中的覆盖应该自动创建一个不会过期的租约。所以我试试这个:

没有骰子。根据另一篇 MSDN 文章,重写 InitializeLifetimeService 并返回 Nothing 会做同样的事情。因此,在 A 类中,我会:

再一次,什么也没有发生。因此,通过另一篇文章,我尝试设置一个长租约:

部分问题似乎是我从未在初始状态下获得 A。但是,如果我使用以前的设置并始终返回 Nothing,那应该不是问题,对吧?不幸的是,做这种事情的例子很少,所以我很可能做错了什么。我很清楚我应该如何解决这个问题,如果我无法克服这个问题,整个项目都是徒劳的。

我可能应该提到(第三方,封闭源代码)DLL 不可序列化,并且极不可能继承 MarshalByRefObject。这就是我将类放入 AppDomain 而不是 DLL 的原因,但这可能是问题的一部分。

这个问题可能是相关的,但设置与我正在做的不同,它适用于 C#,我在脑海中转换为 VB 时遇到了一点麻烦。

0 投票
1 回答
205 浏览

unity-container - 实体框架上下文处理陈旧数据

我正在使用 Unity 注入上下文并使用以下生命周期管理器...

  • 第一个请求到第一页:显示值。
  • 对第二页的第一个 Web 请求:更新值。
  • 对第一页的第二个 Web 请求:显示旧值。
  • 对第二页的第二个 Web 请求:显示新值。

我必须重新启动 VS 开发服务器才能让第一页显示新值。

那么上下文a)如何存在于页面请求之间并且b)特定于页面?

0 投票
2 回答
325 浏览

c# - 需要关于线程中创建的对象的生命周期的解释

我有一个绑定到 BindingList 的 DevExpress GridControl。

我试图从一个线程修改 BindingList 并且这引发了一个异常,我用谷歌搜索它并找到以下解释:

此问题与 XtraGrid 没有直接关系。不幸的是,您不能在后台线程中更改网格的数据源,因为这会导致很多同步问题。XtraGrid 可能会在您的后台线程更改它的同时对底层数据源执行一些操作。在这种情况下,网格稍后可能会收到更改通知,并会尝试从数据源更新行,这将导致上述问题。很多情况下可能会出现这个问题。例如,当用户编辑数据、对其进行分组或 XtraGrid 尝试重新计算摘要时。此问题的唯一解决方案是在后台线程中更改 Grid 的 DataSource 引用(注意:您需要使用 Invoke 方法来实现它)。换个说法,在后台线程中,您应该使用 DataSource 的本地副本,并在必要时将其克隆传递给 Grid 的 DataSource。在随附的示例中,您将找到一个演示此方法的示例项目。

我尝试了它所说的,结果是:

它有效,但我不明白线程结束后数据源会发生什么?不是newList被毁了吗?

我在想的是,最后我会重新克隆 newList 并将其设置回proxies(原始数据源)

0 投票
4 回答
1551 浏览

c++ - 绑定到函数参数的引用会延长该临时变量的生命周期吗?

我有这个代码(简化版):

我不能完全确定 C++03 标准 $12.2/5 措辞的程度

引用绑定到的临时对象或作为临时对象绑定的子对象的完整对象的临时对象在引用的生命周期内持续存在...

在这里适用。

reference上面代码中的变量是有效的还是悬空的?调用代码中的引用会延长作为参数传递的临时变量的生命周期吗?