【发布时间】:2016-02-11 06:05:37
【问题描述】:
有一个可能共享的资源,X与前台线程关联,它被两个实例 (Y, Z) 使用并作为依赖项提供。因为 X 可以被共享,所以它不能被任何一个使用站点(Y 或 Z)处理掉。
显而易见的解决方案是确保在不再使用 X 后,手动在“某个适当的时间”处理 X:在这种情况下,可以假设这意味着 X 不再是强的-可达。但是,在这种情况下,有一个 [buggy] 客户端不这样做。
由于 X 有一个关联的前台线程,这可以防止进程终止(完全?)。
有没有一种方法可以让 X - 无需外部依赖,甚至知道它是否在“可执行文件”或“Windows 服务”中 - 确保在进程终止之前/之后调用 Dispose?
是否有更智能的方法来处理可能有一个或多个消费者的(未跟踪的)共享资源?
目前这依赖于终结器,但正如宣传的那样,这是..不可靠的。
【问题讨论】:
-
对您来说,“过程即将结束”是什么意思?除了正在运行的 X 之外的所有前台线程的终止?或者您是否有更明确的信号,例如引发的事件或设置为
false的标志,它打破了while循环? -
你能得到流程实例吗?并连接到 Process Exited 事件?
-
@Viru 该事件不会触发,因为来自
X的线程使进程保持活动状态。 -
另一个选项类似于'让每个 Y/Z 都处理 X,除非指示不要这样做' .. 或者至少将错误推到其他地方,这比拥有更好(在这种情况下)一个无法可靠终止的进程。
-
我想我可能有一个 hacky 解决方案可以做到这一点,它基本上是您的终结器解决方案,但不是终结器,而是使用计时器检查 WeakRefrences 列表。我现在没有时间,但明天早上我会用代码示例写一个正式的答案。编辑:当然最好的解决方案是“修复错误的客户端并停止尝试解决问题”,但这是现实世界。
标签: c# .net multithreading dispose shutdown