0

我正在编写一些二进制 (C#) PowerShell cmdlet,它们包装了需要您实例化和销毁上下文对象的第 3 方库的功能。这个库有几个怪癖:

  1. 它需要在进程退出之前关闭其上下文,否则它会在那个时候大声地使进程崩溃。
  2. 它不喜欢在短时间内重复实例化和销毁上下文,或者它开始产生内部错误。

由于#2,在每个 cmdlet 中实例化和销毁库的时间跨度太短,因此我需要尽可能长时间地保持库的存活时间。因此,我计划将库上下文存储在 PowerShell 运行空间的会话状态中,以便它在运行空间的持续时间内(即交互式 shell 的生命周期)持续存在。

但是到了#1,我仍然需要在运行空间关闭之前处理库。据我了解,这发生在我的 cmdlet 生命周期之外。有什么办法可以挂钩运行空间的关闭以破坏我的库?我可以通过Runspace.StateChanged事件在 cmdlet 进程中执行此操作,但是有没有办法确保我的库在运行空间关闭时关闭,即使在我的 cmdlet 进程完成之后也是如此?

4

1 回答 1

2

如果挂钩Runspace.StateChanged事件,则无需执行 cmdlet 即可调用事件处理程序。当RunspaceStateEventArgs指示Closing.

另一种选择是围绕实现终结器的库创建一个包装器对象。在终结器(或 Dispose() 方法,如果您实现 IDisposable)内部关闭库。因此,当创建库包装器时,它可能隐藏在某处的静态中,因此不会由于对象被 GC 收集(并最终确定,即库关闭)。稍后,当 PowerShell 进程关闭时,它将尝试完成所有仍然挂起的对象。

另一种选择是要求最终用户使用 new-foosession 打开库并获取它的句柄,然后使用 remove-foosession 允许用户显式关闭库。如果用户忘记调用 remove-foosession,您仍然可以使用上面的终结器方法。

于 2013-10-14T20:55:35.853 回答