PowerShellでは、オブジェクトのadd_NameOfEvent({scriptblock})
メソッドを使用してイベントを購読することができます。これはボタンなどのフォームオブジェクトではうまくいきますが、System.Timers.Timer
で試してみるとうまくいきませんでした。何故ですか?サンプル:add_EventNameが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
が正常に動作しますが、$timer1
は、コンソールに書き込むことはありません。 Timer
をexと異なるものにする理由フォームコンポーネント(add_...
メソッドが動作する場所)? Timer
は別のスレッドで実行されますか?そのため、「隠し」コンソールに書き込みますか?
方法はそれに慣れていない人のためのフォーム・コンポーネントで機能することを証明:
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。私は尋ねる前にsynchronizingobjectについて読んだことがあります。また、フォームにコントロールを追加するために使用できる通常の追加コントロールメソッドもsyncronizingobjectプロパティを設定していると思います。しかし、コンソールとタイマーを同期させるために使用できる変数/オブジェクトが必要です。私はこれを正解と見なしますが、ダミーフォームを作成せずに誰かが完全な解答を提供できる場合に備えて、数日待つでしょう:-) –
Graimer私は@ x0nがより良いものを与えることを願う、彼はパワーシェルイベントに関する深い知識を持っています。とにかく私は本当に面白いあなたの質問を見つけた! –