因此,有很多示例使用PowerShell中的Windows窗體,這顯然嚴重依賴於.NET事件。PowerShell中的.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窗體有關?
謝謝你的答覆Trevor。我完全理解,'Register-ObjectEvent'可以讓我訪問'$ event'對象(儘管如上面用Form1_Load函數所示,這也可以通過'Add_'方法來完成),但在上面的例子中,我是在這兩個例子中,對'$ event'變量什麼也不做,我只是發送一些東西到流水線。我希望兩者都有相同的結果。正如我所說,當我做'Add_ '我絕對沒有回來。 –
cogumel0
2014-08-29 14:35:01
$ event也可以在add_ *處理程序中使用,它只是調用$ _,而不是...或者,您可以提供一個param()語句來捕獲它。我想不通爲什麼add_elapsed不在這裏工作。 – Jaykul 2014-08-29 19:07:41
當SynchronizingObject爲null時,處理Elapsed事件的方法在系統線程池的線程上調用。 http://msdn.microsoft.com/en-us/library/system.timers.timer.synchronizingobject – Jaykul 2014-08-29 19:12:43