我有一个由AsyncOperation通过.Post()调用的方法更新()。当我在该函数中放置一个MessageBox时,我得到了多个MessageBox,我试图理解为什么会发生这种情况。
Messagebox应该暂停执行Update(),直到单击'OK‘为止,但由于.Post(),我在Update()中重新进入,导致下一个消息框在前一个消息框关闭之前出现。
我的第一个想法是将SyncLock放在Update()中,这样它永远不会同时运行,但它没有任何效果。当我在MessageBox中输出.ManagedThreadID时,所有调用都具有相同的线程ID,因此SyncLock没有作用似乎是合乎逻辑的,因为它只阻塞不同的线程。
有人能解释一下这是怎么回事吗?单个线程如何同时执行相同的函数?
发布于 2011-10-30 23:25:28
消息框只在显示它的线程上是模态的。本例中的UI线程应该是这样的。它不能阻止工作线程调用Post(),因此您将继续获得更多的消息框。SyncLock也不能工作,它在同一线程上是可重入的。在MessageBox.Show()调用之前设置为true,调用后设置为false的简单布尔标志就可以完成此任务,如果设置为true,则不要再次调用Show。
或者只是不使用MessageBox,Debug.Print()是一种很好的跟踪方法。默认情况下,文本转到“输出”窗口。调试器断点也可以创造奇迹。
https://stackoverflow.com/questions/7941905
复制相似问题