c# - 在 Powershell Cmdlet 中处理同步的最佳方式

标签 c# powershell threadpool

作为一项实验,我一直在用 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/

相关文章:

在 foreach 循环中调用时 Powershell 停止处理空参数

.net - 线程返回线程池后ExecutionContext是否被清除?

C# 派生类型的显式转换

powershell - 如何使用 Where-Object/Wildcards 匹配多个字符串?

c# - 使用 `ElementName` 的 WPF 绑定(bind)失败,但在 Path 属性中指定 ElementName 有效吗?

loops - Powershell XML 解析

c - pthread C 中的池线程

Java 线程池/执行器服务和 wait()s - 线程和任务队列发生了什么?

c# - 检查线程是否在 Gui 上下文中

c# - async/await 对 web 应用有用吗?