0

我有一个由 AsyncOperation 通过 .Post() 调用的方法 Update()。当我在该函数中放置一个 MessageBox 时,我得到了多个消息框,我试图理解为什么会发生这种情况。

消息框应停止执行 Update(),直到单击“确定”,但由于 .Post(),我重新进入 Update(),导致下一个消息框出现在前一个消息框关闭之前。

我的第一个想法是将 SyncLock 放在 Update() 中,这样它就永远不能同时运行,但它没有效果。当我在 MessageBox 中输出 .ManagedThreadID 时,所有调用都具有相同的线程 ID,因此 SyncLock 不起作用似乎是合乎逻辑的,因为它只会阻塞不同的线程。

那么有人可以解释这里发生了什么吗?单个线程如何同时执行相同的功能?

4

1 回答 1

0

消息框仅在显示它的线程上是模态的。在您的情况下,UI 线程应该如此。它不能阻止工作线程调用 Post(),因此您将继续获得更多消息框。SyncLock 也不能工作,它在同一个线程上是可重入的。在 MessageBox.Show() 调用之前设置为 true 并在调用之后设置为 false 的简单布尔标志将完成这项工作,如果设置为 true,则不要再次调用 Show。

或者只是不使用 MessageBox,Debug.Print() 是一种很好的跟踪方式。默认情况下,文本进入输出窗口。调试器断点也可以创造奇迹。

于 2011-10-30T15:25:27.510 回答