我有一个方法Update(),它由AsyncOperation通过.Post()调用。当我在该函数中放置MessageBox时,我会收到多个消息框,而我正在尝试理解为什么会发生这种情况。
Messagebox应该暂停Update()的执行,直到'OK'被点击,但由于.Post()我在Update()中重新进入,导致下一个消息框出现在前一个消息框关闭之前。 / p>
我的第一个想法是将SyncLock放在Update()中,以便它永远不会同时运行,但它没有任何效果。当我在MessageBox中输出.ManagedThreadID时,所有调用都具有相同的线程ID,因此似乎逻辑上SyncLock没有效果,因为它只阻止不同的线程。
那么有人可以解释这里发生了什么吗?单个线程如何同时执行相同的功能?
答案 0 :(得分:0)
消息框仅在其显示的线程上是模态的。您的案例中的UI线程应该如此。它无法阻止工作线程调用Post(),因此您将继续获得更多消息框。 SyncLock也无法工作,它可以重新进入同一个线程。一个简单的布尔标志,你在MessageBox.Show()调用之前设置为true,之后设置为false将执行该作业,如果设置为true,则不要再次调用Show。
或者只是不使用MessageBox,Debug.Print()是一种很好的跟踪方法。默认情况下,文本将转到“输出”窗口。调试器断点也可以创造奇迹。