In PowerShell è possibile abbonarsi a un evento utilizzando il metodo add_NameOfEvent({scriptblock})
dell'oggetto. Funziona bene per oggetti Form come pulsanti ecc. Tuttavia, quando l'ho provato con un System.Timers.Timer
non ha funzionato. Perché? Esempio:Perché non add_EventName funziona con Timer?
$timer1 = New-Object System.Timers.Timer
$timer1.Interval = 2000
$timer1.add_Elapsed({ Write-Host "Timer1 tick" })
$timer2 = New-Object System.Timers.Timer
$timer2.Interval = 2000
Register-ObjectEvent -InputObject $timer2 -EventName Elapsed -Action { Write-Host "Timer2 tick" }
$timer1.Start()
$timer2.Start()
$timer2
funzionerà bene, ma $timer1
non potrà mai scrivere al console. Ciò che rende un Timer
diverso da ex. un componente del modulo (dove funziona il metodo add_...
)? Il Timer
viene eseguito in un thread separato e, a causa di ciò, scrive su una console "nascosta"?
La prova che il metodo funziona con form-componenti per chi non ha familiarità con esso:
PS > Add-Type -AssemblyName System.Windows.Forms
PS > $b = New-Object System.Windows.Forms.Button
PS > $b.add_click({ Write-Host "button" })
#Get-EventSubscriber won't show this event, but it's added
PS > $b.PerformClick()
button
+1 per una buona risposta. Ho letto su synchronizingobject prima di chiederlo, e suppongo che il normale metodo di controllo aggiuntivo che puoi usare per aggiungere il controllo in un modulo imposta anche la proprietà syncronizingobject. Tuttavia, ci deve essere una variabile/oggetto che posso usare per sincronizzare il timer con la console. Considero questa la risposta corretta, ma aspetterò un paio di giorni per contrassegnarla nel caso qualcuno possa fornire una soluzione completa (senza creare una forma fittizia) :-) –
Graimer Spero che x0n possa venire a dare una migliore, ha una profonda conoscenza degli eventi di PowerShell. Ad ogni modo ho trovato la tua domanda davvero interessante! –