【发布时间】:2015-02-06 18:28:40
【问题描述】:
我试图一次只允许一个线程进入某个代码块:
private static object lockObject = new object();
protected override void WndProc(ref Message message) {
if (id != null) {
id.ProcessMessage(message);
lock(lockObject) {
if (id.ScanCode.Length > 4) {
...
}
}
}
base.WndProc(ref message);
}
有时有 2 个线程进入其中并执行代码。我已经在 VS 调试器中确认了这一点。有时只有 1 个线程进入,这很好,但至少有一半的时间,2 个线程进入 - 似乎永远不会超过 2 个。
在 if 块中我正在这样做:
id.ScanCode = string.Empty;
return;
对我来说,这似乎应该阻止第二个线程进入,如果它确实被阻塞了。但也许我做错了。防止第二个线程进入那里的最简单方法是什么?他们可以同时进入吗?
【问题讨论】:
-
我怀疑这是怎么发生的。你已经使用了 Lock() 两个线程无法在 lock 语句中输入代码
-
要么是调试器撒谎,要么是你错误地解释了你看到的内容
-
他很可能误解了调试器的输出。
-
这似乎是一个窗口进程。任何窗口都属于一个特定线程,因此不能是多个线程进入此代码。如果您使用 Invoke 或类似工具,它可能看起来就是这样。
-
@SweatCoder 可以显示调试器的屏幕截图,您可以在其中看到两个线程?
标签: c# multithreading c#-4.0