我正努力防止用户快速垃圾邮件单击一个按钮,这将在多次执行代码时冻结应用程序几分钟。
$searchBtn_clicked = {
$searchBtn.Enabled = $false
... some code that fills a listview from search result
$searchBtn.Enabled = $true
}
我的问题是:无论如何,上面的代码将与单击按钮一样执行多次。单击后禁用按钮没有任何改变。我还尝试了在重新启用之前添加start-sleep 2
。
第一次单击将触发代码,随后的单击将显示在已禁用的按钮上……只要该按钮再次变为“启用”,仍将触发Click事件。
这是怎么回事?某种异步魔术?所有点击事件都以某种方式排队,并且仅在再次启用按钮后才能处理?
我是PowerShell的新手,非常困惑。
答案 0 :(得分:3)
添加[System.Windows.Forms.Application]::DoEvents()
:
$searchBtn.Add_Click({
$this.Enabled = $false
# ... some code that fills a listview from search result
# flush out all pending events
[System.Windows.Forms.Application]::DoEvents()
$this.Enabled = $true
})
希望有帮助
Windows消息按顺序排队和处理。如果您的代码繁忙,这些消息(垃圾邮件点击)将存储在该队列中,并在可能时进行处理。 DoEvents()
告诉窗口处理当前在消息队列中的所有消息,从而有效地刷新它。