Events PowerShell中的.NET事件

Events PowerShell中的.NET事件,events,powershell,Events,Powershell,因此,有很多例子说明了如何在PowerShell中使用Windows窗体,这显然严重依赖于.NET事件 在这些示例中,从不使用Register ObjectEvent订阅事件,而是执行以下操作 $form1.Add_Load({ Form1_Load $form1 $EventArgs }) 或者 $form1_Load={ Write-Host "Hello, loading form!" } $form1.Add_Load($form1_Load) 这似乎比使用Register Obj

因此,有很多例子说明了如何在PowerShell中使用Windows窗体,这显然严重依赖于.NET事件

在这些示例中,从不使用
Register ObjectEvent
订阅事件,而是执行以下操作

$form1.Add_Load({ Form1_Load $form1 $EventArgs })
或者

$form1_Load={ Write-Host "Hello, loading form!" }

$form1.Add_Load($form1_Load)
这似乎比使用
Register ObjectEvent
然后调用
Receive Job
查看是否有任何事件要简单得多

对于调用方法
$form1.Add_Load
Register ObjectEvent-InputObject$form1-Event Load
之间的区别,以及为什么在某些情况下调用方法似乎不起作用,我感到困惑

例如,如果我运行以下代码:

$timer = New-Object Timers.Timer
$timer.Interval = 500
$timer.Start()
Register-ObjectEvent -inputObject $timer -eventName Elapsed -Action {Get-Random -Min 0 -Max 100}
我创建了一个作业,如果我运行
Receive job(get job)
,我会得到一个自上次
Receive job
以来生成的所有随机数的列表,正如预期的那样

但是,如果我运行以下命令,则什么也得不到。没有错误,没有警告,什么都没有

$timer = New-Object Timers.Timer
$timer.Interval = 500
$timer.Start()
$timer.Add_Elapsed({Write-Host (Get-Random -Min 0 -Max 100)})

有什么区别?这与第二个示例中未使用的Windows窗体有关吗?

使用
Register ObjectEvent
时,可以访问
$event
自动变量,该变量包含对生成/引发的事件的引用。您可以通过这种方式访问有关事件的详细信息,但是,据我目前所知,如果您使用
Add.*
Remove.*
.NET方法,则无法访问事件详细信息

以下是有关
$event
自动变量的PowerShell文档

$Event

包含一个PSEventArgs对象,该对象表示正在处理的事件 处理。此变量仅在的操作块中填充 事件注册命令,如Register ObjectEvent。价值 此变量的对象与Get-Event cmdlet返回的对象相同。 因此,您可以使用$Event变量的属性,例如 $Event.TimeGenerated,在动作脚本块中


短版本:当
Timer.SynchronizingObject
为空时,处理已运行事件的方法将在系统线程池中的线程上调用,但
Register ObjectEvent
会处理类似的内容;-)

您还可以将窗体分配给SynchronizingObject,然后使用ShowDialog()将运行空间线程设置为窗体的UI线程,然后应运行事件,直到关闭窗体并再次放弃线程为止。(我知道不是很有用)


我还在想办法告诉计时器使用主机线程…

谢谢你的回复Trevor。我完全理解,
Register ObjectEvent
允许我访问
$event
对象(尽管如上所示,使用
Form1\u Load
函数也可以通过
Add\u
方法来完成),但在我上面的示例中,我没有对两个示例中的
$event
变量执行任何操作,我只是把一些东西送到管道里。我希望这两方面的结果都是一样的。正如我所说的,当我执行
Add\u
时,我完全没有得到任何回报。Add\u*处理程序中也有$event,它只是被称为$。。。或者,您可以提供一个param()语句来捕获它。我不明白为什么add_appeased在这里不起作用。当SynchronizingObject为null时,将在系统线程池中的线程上调用处理appeased事件的方法。