Вы «теряете» события, потому что заканчиваете свой сценарий слишком рано. Ваше действие по событию, определенное Register-ObjectEvent ([Utils.StaticEventTest]) Fired -SourceIdentifier $srcId -Action { $global:recvd++ }
, будет выполняться асинхронно с вашим сценарием. Если я повторю то, что вы сделали, я получу еще худшие результаты (возможно, из-за виртуальной среды):
C:\Users\user\Desktop>for /l %n in (1, 1, 10) do @powershell.exe -executionPolicy remoteSigned -file test.ps1
total 1000 events fired - 17 received
total 1000 events fired - 100 received
total 1000 events fired - 202 received
total 1000 events fired - 16 received
total 1000 events fired - 3 received
total 1000 events fired - 120 received
total 1000 events fired - 1 received
total 1000 events fired - 162 received
total 1000 events fired - 1 received
total 1000 events fired - 27 received
Но когда я добавлю Start-Sleep -Seconds 5
после вашего for
-l oop, я получить этот результат (по крайней мере, в моей среде):
C:\Users\user\Desktop>for /l %n in (1, 1, 10) do @powershell.exe -executionPolicy remoteSigned -file test.ps1
total 1000 events
total 1000 events
total 1000 events
total 1000 events
total 1000 events
total 1000 events
total 1000 events
total 1000 events
total 1000 events
total 1000 events
Таким образом, все события, которые вы запустили, есть, ни одно событие не будет потеряно. Но если вы хотите увидеть действие, выполненное над ними сразу после их запуска, вам придется подождать, пока все (асинхронные) действия не будут выполнены.
Конечно, Start-Sleep
с фиксированным интервалом времени не вариант здесь, потому что вы не можете знать, сколько времени требуется системе для выполнения всех действий. Но это показывает причину, по которой вы думаете, что теряете события.
Возможный способ ожидания ваших событий - это строка после вашего for
-l oop:
while ($global:recvd -lt $fired) {Start-Sleep -Milliseconds 10}
Это работает даже для 100 000 событий на итерацию (действительно пытались):
C:\Users\user\Desktop>for /l %n in (1, 1, 10) do @powershell.exe -executionPolicy remoteSigned -file test.ps1
total 100000 events
total 100000 events
total 100000 events
total 100000 events
total 100000 events
total 100000 events
total 100000 events
total 100000 events
total 100000 events
total 100000 events
Ни одно событие не потеряно. Это заставляет меня поверить, что стрельба и прослушивание событий работает как положено. Я не могу воспроизвести какие-либо контрмеры.