如果在C#应用程序的UI线程上调用,Monitor.Enter()是否允许处理事件?

时间:2011-02-14 18:51:48

标签: .net locking

我正在调查堆栈跟踪(在调试时看到),如下所示:

MyUtility.AcquireLock()
[some of our code]
MyControl.OnPaint(PaintEventArgs e)
[some external WinForms (painting) code]
(native code corresponding to Monitor.Enter(object))
MyUtility.AcquireLock()
[some of our code]
MyControl.OnLoad(EventArgs e)

这是否有意义或是否有些事情搞砸了我的堆栈跟踪?

我几乎(但不是完全)确定,没有其他线程持有此锁,我正在尝试获取(通过使用Monitor.Enter())。

1 个答案:

答案 0 :(得分:1)

确实如此。 Monitor.Enter执行所谓的警报等待。只有少数人知道这在2011年意味着什么,因为它是一个模糊的概念。这意味着线程将在等待时抽取窗口消息。是的,这看起来很奇怪。你目前处于一个非常黑暗的痛苦世界,因为你面临着不确定性的重入问题。

光明的方式是不要等待gui线程!启动后台线程,可能是BackgroundWorker。