为什么我的 RunWorkerCompletedEventHandler 可以并行调用主线程多次?
Why is my RunWorkerCompletedEventHandler able to invoke the main thread multiple times in parallel?
我的 BackgroundWorker
的 RunWorkerCompletedEventHandler
在我的主线程中调用了一个函数,它显示了一个 MessageBox
对话框。我测试了如果我定期调用 BW(使用 Timer
)会发生什么,我不明白为什么这会导致我随着时间的推移收到多个消息框。我的意思是,在调用我的 RunWorkerCompletedEventHandler
函数期间,GUI 线程不应该被阻塞吗?
每当我关闭对话框时,每个对话框的其余功能都会正常执行。
如果我用 Thread.Sleep
替换 MessageBox.Show
,那么我就没有这个问题。函数调用都一个接一个地执行。睡眠期间不会发生第二次调用,就像 MessageBox
-es.
一样
为什么 MessageBox
会发生这种意外行为,我可以更改它以正确阻止线程吗?
显示消息框(或关闭消息框)不是 activity 需要连续使用 UI 线程。 UI 线程用于创建代表消息框的新 UI,但它随后会返回到消息循环(的一个版本),等待新的工作完成。
这就是为什么消息框可以响应,可以在屏幕上移动等,因为 UI 线程可以自由地对所需事件做出反应。
我的 BackgroundWorker
的 RunWorkerCompletedEventHandler
在我的主线程中调用了一个函数,它显示了一个 MessageBox
对话框。我测试了如果我定期调用 BW(使用 Timer
)会发生什么,我不明白为什么这会导致我随着时间的推移收到多个消息框。我的意思是,在调用我的 RunWorkerCompletedEventHandler
函数期间,GUI 线程不应该被阻塞吗?
每当我关闭对话框时,每个对话框的其余功能都会正常执行。
如果我用 Thread.Sleep
替换 MessageBox.Show
,那么我就没有这个问题。函数调用都一个接一个地执行。睡眠期间不会发生第二次调用,就像 MessageBox
-es.
为什么 MessageBox
会发生这种意外行为,我可以更改它以正确阻止线程吗?
显示消息框(或关闭消息框)不是 activity 需要连续使用 UI 线程。 UI 线程用于创建代表消息框的新 UI,但它随后会返回到消息循环(的一个版本),等待新的工作完成。
这就是为什么消息框可以响应,可以在屏幕上移动等,因为 UI 线程可以自由地对所需事件做出反应。