作为一项实验,我一直在用 C# 编写一个使用 SystemFileWatcher 的 cmdlet。如您所知,SystemFileWatcher 将在发生更改事件时调用委托(delegate)。我想将消息从委托(delegate)发送回用户。具体来说,我想调用 WriteProgress。
不幸的是,如果从“管道线程”以外的线程调用,WriteProgress 和所有其他 Write* 方法都会抛出异常。此外,Powershell 似乎不提供 SynchronizationContext,因此我不确定如何将我的委托(delegate)编码回正确的线程。
在我看来,由于 Powershell 需要 GUI 操作在特定线程上执行,框架应该提供一种方法来编码回该线程。我错过了什么?有没有更简单的方法来同步我的 cmdlet 中的线程? Powershell 选择使用基于 ThreadPool 的 SynchronizationContext 是否有原因,尽管它的 Write* 命令需要等效于 GUI 线程?
非常感谢!
最佳答案
在我的 PS 代码运行之前,我很幸运地设置了 System.Management.Automation.Runspaces.Runspace.DefaultRunspace
。 (我为作为 WCF 服务器运行的 Powershell 执行了此操作)。
建议你看这个blog ,它显示了在调用 PS 脚本之前从 C# 设置 DefaultRunspace,这是我对我的 WCF 服务器产生想法的地方。
关于c# - 在 Powershell Cmdlet 中处理同步的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35667143/