【发布时间】:2015-02-20 04:08:59
【问题描述】:
我想从父 Powershell 脚本启动非阻塞 UI,并接收来自子作业的按钮点击等 UI 消息。我使用 WinForms 进行这种消息传递,但我更喜欢使用 ShowUI,因为创建基本 UI 所需的代码更少。但不幸的是,我还没有找到一种使用 ShowUI 将消息发送回父作业的方法。
[Works] 使用 Start-Job 时转发事件
使用Start-Job,将事件从子作业转发到父作业相当简单。这是一个例子:
$pj = Start-Job -Name "PlainJob" -ScriptBlock {
Register-EngineEvent -SourceIdentifier PlainJobEvent -Forward
New-Event -SourceIdentifier PlainJobEvent -MessageData 'My Message'
}
Wait-Event | select SourceIdentifier, MessageData | Format-List
正如预期的那样,它会打印出来:
SourceIdentifier : PlainJobEvent
MessageData : My Message
[不工作] 使用 Start-WPFJob 时转发事件
另一方面,使用Start-WPFJob 似乎不会将事件从子级转发给父级。考虑这个例子:
Import-Module ShowUI
$wj = Start-WPFJob -ScriptBlock {
Register-EngineEvent -SourceIdentifier MySource -Forward
New-Button "Button" -On_Click {
New-Event -SourceIdentifier MySource -MessageData 'MyMessage'
}
}
Wait-Event | select SourceIdentifier, MessageData | Format-List
运行这个例子会产生这个窗口:
但是,单击该按钮不会在父作业中产生事件。
- 为什么
Start-WPFJob示例不向父作业生成事件? - 是否有其他方法可以使用 ShowUI 以非阻塞方式生成按钮并从中接收事件?
【问题讨论】:
-
哦,这是个好问题。或者想法。我的意思是,如果 WPFJob 转发事件会很好,我想知道需要什么......
-
从 WPFJob 转发事件将为 ShowUI 开辟整个用例世界。 MVC 应用程序只需几行代码就可以实现。
-
是的,我在玩它。我不确定你为什么要这样做。我的意思是,为什么您希望 UI 中的事件进入不同的流程?您可以流式输出...
-
我不确定您所说的流输出是什么意思。我有一个管理长时间运行的作业的状态机。状态机由源自 .NET 框架的各种 powershell 事件触发。状态机需要自己的线程,因为它会阻塞等待事件。 UI 需要自己的线程,因为它阻塞了 WPF 中的某个位置。例如,为了让用户暂停/恢复状态机,事件需要从 UI 发送到状态机运行空间……不知何故。
-
我无法让它工作,我将不得不寻求一些帮助,但要等到新年之后;)我将在下面发布一个糟糕的解决方法......跨度>
标签: wpf events powershell user-interface jobs