2014-08-29 58 views
2

因此,有很多示例使用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_LoadRegister-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窗體有關?

回答

1

短版:當Timer.SynchronizingObject爲空,處理該事件經過的調用方法從系統線程池中的線程,但Register-ObjectEvent需要的東西,照顧這樣的;-)

http://msdn.microsoft.com/en-us/library/system.timers.timer.synchronizingobject

您也可以將表單分配給SynchronizingObject,然後使用ShowDialog()將運行空間線程設置爲表單的UI線程,然後應該運行這些事件,直到您關閉表單並再次放棄線程爲止。 (我知道不是非常有用)。

我仍然試圖想辦法告訴計時器使用主機的線程...

0

當您使用Register-ObjectEvent時,您可以訪問$event自動變量,其中包含對生成/拋出的事件的引用。您可以通過這種方式訪問​​有關該事件的詳細信息,但是,如果您使用的是.NET方法的Add_*Remove_*,則根據當前的瞭解,您無法訪問活動詳細信息。

以下是有關$event自動變量的PowerShell文檔。

$事件

包含表示正在 處理事件PSEventArgs對象。此變量僅在 的事件註冊命令(如Register-ObjectEvent)的操作塊中填充。此變量的值 與Get-Event cmdlet返回的對象相同。 因此,您可以在Action腳本塊中使用$ Event變量的屬性,例如 $ Event.TimeGenerated。

+0

謝謝你的答覆Trevor。我完全理解,'Register-ObjectEvent'可以讓我訪問'$ event'對象(儘管如上面用Form1_Load函數所示,這也可以通過'Add_ '方法來完成),但在上面的例子中,我是在這兩個例子中,對'$ event'變量什麼也不做,我只是發送一些東西到流水線。我希望兩者都有相同的結果。正如我所說,當我做'Add_ '我絕對沒有回來。 – cogumel0 2014-08-29 14:35:01

+0

$ event也可以在add_ *處理程序中使用,它只是調用$ _,而不是...或者,您可以提供一個param()語句來捕獲它。我想不通爲什麼add_elapsed不在這裏工作。 – Jaykul 2014-08-29 19:07:41

+0

當SynchronizingObject爲null時,處理Elapsed事件的方法在系統線程池的線程上調用。 http://msdn.microsoft.com/en-us/library/system.timers.timer.synchronizingobject – Jaykul 2014-08-29 19:12:43