我了解到Timers.Timer是Threading.Timer类的包装器.计时器应在线程池的工作线程上运行.然而,在下面的示例中,当对话框显示时,事件不会执行.我应该猜到,表单线程和辅助线程是独立运行的,因此文件将填充不同的值?现在它们是相同的,因为所有激发的事件都是在窗体关闭后立即执行的.

$timer = New-Object Timers.timer
$frm = New-Object System.Windows.Forms.Form
$timer.Interval = 2000
Register-ObjectEvent -InputObject $timer -EventName Elapsed -Action {get-date -Format "ss" >> dezefile.txt}
$timer.Start()
$frm.ShowDialog()
$timer.stop()
$timer.Dispose()

推荐答案

  • PowerShell engine can only process events registered for via 100 while it is in control of the foreground thread号.

  • A 100 call puts 101 in charge of the foreground thread, blocking PowerShell's event processing,直到表单(对话框)关闭.

Solution options:

  • 改用System.Windows.Forms.Timer实例,通过add_Tick()调用订阅其Tick事件,并在传递给调用的脚本块内执行所需的处理.

  • 放弃.ShowDialog()呼叫,转而使用非阻塞.Show()呼叫,这需要随后进入周期性[System.Windows.Forms.Application]::DoEvents()呼叫的循环.

详情见this answer.

.net相关问答推荐

Azure管道-使用.NET 8 RC2 SDK生成C#项目失败

Puppeteer LaunchAsync 在未打开浏览器的情况下挂起

使用 MassTransit、.NET Core 和 RabbitMQ 的设计挑战

即时窗口中的动态导致Microsoft.CSharp.RuntimeBinder.Binder未定义或导入错误

调整小数精度,.net

在生产中使用实体框架(代码优先)迁移

C#6.0 字符串插值本地化

如何在 C# 中创建表达式树来表示String.Contains("term")?

如何从 appsettings.json 中获取价值

重新启动(回收)应用程序池

如何将字符串列表数据绑定到 WPF/WP7 中的 ListBox?

C# 有办法给我一个不可变的字典吗?

如何明智地使用 StringBuilder?

是否有可用的 WPF 备忘单?

ILookup 接口与 IDictionary

C#As的 VB.NET 类似功能

使用 XmlDocument 读取 XML 属性

Moq - 不可覆盖的成员不能用于设置/验证表达式

在 C# 中使用 Bitmap 对象查找图像格式

没有科学记数法的双精度字符串转换