为什么我的 RunWorkerCompletedEventHandler 可以并行调用主线程多次?

Why is my RunWorkerCompletedEventHandler able to invoke the main thread multiple times in parallel?

我的 BackgroundWorkerRunWorkerCompletedEventHandler 在我的主线程中调用了一个函数,它显示了一个 MessageBox 对话框。我测试了如果我定期调用 BW(使用 Timer)会发生什么,我不明白为什么这会导致我随着时间的推移收到多个消息框。我的意思是,在调用我的 RunWorkerCompletedEventHandler 函数期间,GUI 线程不应该被阻塞吗? 每当我关闭对话框时,每个对话框的其余功能都会正常执行。

如果我用 Thread.Sleep 替换 MessageBox.Show,那么我就没有这个问题。函数调用都一个接一个地执行。睡眠期间不会发生第二次调用,就像 MessageBox-es.

一样

为什么 MessageBox 会发生这种意外行为,我可以更改它以正确阻止线程吗?

显示消息框(或关闭消息框)不是 activity 需要连续使用 UI 线程。 UI 线程用于创建代表消息框的新 UI,但它随后会返回到消息循环(的一个版本),等待新的工作完成。

这就是为什么消息框可以响应,可以在屏幕上移动等,因为 UI 线程可以自由地对所需事件做出反应。