【问题标题】:PerThreadLifetimeManager in UnityUnity 中的 PerThreadLifetimeManager
【发布时间】:2010-05-17 00:07:12
【问题描述】:

在 Unity PerThreadLifetimeManager 文档中,我读到:“这个生命周期管理器不会释放它持有的实例”。参考:http://msdn.microsoft.com/en-us/library/ff647854.aspx

那么,如果我使用的是 ThreadPool,这是否意味着在 ThreadPool 的线程上使用 Unity 解析的对象在返回池之前不会在该线程中完成的工作结束时被释放?

我有什么模式或想法可以确保对象被释放并从线程池中获得一个干净的线程?

谢谢!

【问题讨论】:

    标签: c# unity-container threadpool


    【解决方案1】:

    这取决于生命周期管理器的类型。 PerThreadLifetimeManager 为每个线程维护一个实例。提供了六种类型的终身经理,但这并不意味着如果它们不适合您,您就无法制作自己的。

    似乎您想要TransientLifetimeManager,它为每次调用提供一个新实例。您可以在工作线程中调用 Resolve,使用该实例,并在方法退出之前将其处理掉。

    我不确定您是否可以创建一个生命周期管理器,它会以某种方式自动知道您的线程已完成执行。确保发生这种情况的最佳方法是创建一个方法包装器,它 1) 从 Unity 获取实例(使用 TransientLifetimeManager),执行传入实例的 Action (您的实际工作方法),然后将其处理掉退出前的实例。然后,您将通过将代码传递给此包装器来执行您的代码,该包装器在工作线程上运行。您只需编写一次 Resolve() 和 Dispose() 代码并在任何地方重复使用它。

    【讨论】:

    • 非常感谢您的回答。我正在寻找 PerThreadLifetime 行为,其中我为每个线程获取一个新实例,但希望在方法完成并将线程返回到 ThreadPool 时释放对象。任何想法如何与 Unity 一起工作?
    • @dorian 我给了你可能是唯一可行的方法。容器怎么可能知道你的方法已经执行完毕?唯一合理的设计是在线程退出之前获取一个实例并处理它。你需要任何其他方式的魔法。
    • 我想你给了我一个关于使用 TransientLifetimeManager 模拟 perThread 的好主意。让我处理它,如果它这样做了就回来。
    猜你喜欢
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 2023-01-30
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 2022-07-12
    • 1970-01-01
    相关资源
    最近更新 更多