Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 2个线程同时进入一个锁定的代码块_C#_Multithreading_C# 4.0 - Fatal编程技术网

C# 2个线程同时进入一个锁定的代码块

C# 2个线程同时进入一个锁定的代码块,c#,multithreading,c#-4.0,C#,Multithreading,C# 4.0,我试图一次只允许1个线程输入某个代码块,因此: 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

我试图一次只允许1个线程输入某个代码块,因此:

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);
}
有时,两个线程进入其中,并且都执行代码。我已经在VS调试器中确认了这一点。有时只有一个线程进入,这是很好的,但至少有一半的时间,两个线程进入-似乎永远不会超过两个

在那个if区内,我正在做这个:

id.ScanCode = string.Empty;
return;

对我来说,如果第二个线程被阻塞了,这应该可以阻止它进入。但也许我做错了。防止第二个线程进入的最简单方法是什么?它们可能同时进入吗?

锁定不会阻止任何数量的线程进入该块。它只是延迟他们直到它被释放。它只能向您保证一次只有一个线程将进入该代码块。一旦第一个线程存在,第二个线程就会锁定代码并运行它。等等


如果只需要第一个线程来执行该代码块,只需在它第一次运行时设置一个标志,对于连续的线程,只需首先检查该标志。

锁定不会阻止任何数量的线程进入该代码块。它只是延迟他们直到它被释放。它只能向您保证一次只有一个线程将进入该代码块。一旦第一个线程存在,第二个线程就会锁定代码并运行它。等等


如果只需要第一个线程来执行该代码块,只需在它第一次运行时设置一个标志,对于连续的线程,只需首先检查该标志。

我怀疑这是怎么发生的。。您已经使用了Lock两个线程无法在Lock语句中输入代码调试器存在错误或您正在解释所看到的错误很可能他误解了调试器的输出。这似乎是一个窗口进程。任何窗口都属于一个特定线程,因此不能有多个线程输入此代码。如果您使用Invoke或类似的工具,它可能看起来是这样的。@SweatCoder可以显示调试器的屏幕截图,在其中您可以看到两个线程?我怀疑这是怎么发生的。。您已经使用了Lock两个线程无法在Lock语句中输入代码调试器存在错误或您正在解释所看到的错误很可能他误解了调试器的输出。这似乎是一个窗口进程。任何窗口都属于一个特定线程,因此不能有多个线程输入此代码。如果您使用Invoke或类似的工具,它可能看起来是这样的。@SweatCoder可以显示调试器的屏幕截图,您可以看到两个线程?除了id.ScanCode之外,我还使用了一个add'l flag私有变量,这似乎解决了这个问题。谢谢大家。我仍然很好奇为什么不止一个线程可以运行WndProc。除了id.ScanCode之外,我还使用了一个add'l flag私有变量,这似乎解决了这个问题。谢谢大家。我仍然很好奇为什么不止一个线程可以运行WndProc。