SyncLock for AsyncOperation



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

Messagebox应该停止Update()的执行,直到'OK'被单击,但是由于. post(),我在Update()中重新进入,导致下一个消息框在前一个消息框关闭之前出现。

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

有人能解释一下这是怎么回事吗?一个线程如何同时执行同一个函数?

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

或者不使用MessageBox, Debug.Print()是跟踪的好方法。默认情况下,文本将转到Output窗口。

最新更新