如何使 1 成为函数 "thread wait" 的一部分?

How to make 1 part of a function "thread wait"?

我有这个功能:

protected override void WndProc(ref Message message) {
    if (id != null) {
        id.ProcessMessage(message);

        if (id.ScanCode.Length > 4) {
            ...
        }
    }

    base.WndProc(ref message);
}

这是对键盘输入进行低级侦听,我想必须是多线程才能做到这一点。它运行良好,但重要的是该函数的一部分一次只允许一个线程执行:

if (id.ScanCode.Length > 4) {
        ...
}

我需要整个 if 块一次只允许 1 个线程。一旦线程#1 完成,线程#2 就可以进入并执行。如果可能且简单,所有其他线程也可以中止,因为当一个线程到达这一点时,其他线程将变得无用。但如果这很难或可能导致不稳定,让我们坚持我最初的要求吧。

实现此目的最简单的方法是什么? (提前致谢!)

确保一次只有一个线程进入临界区的最简单方法是使用 lock 语句:

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);
}

https://msdn.microsoft.com/en-us/library/c5kehkcz.aspx

通常最好的方法是使用监视器 class,它允许您锁定代码块的进入和退出:

例如要监视的对象:

static readonly object _locker = new object();   

然后是您的代码:

lock (_locker) {   
    if (id.ScanCode.Length > 4) {
        ...
    }
}  

这是一个很好的参考:http://www.codeproject.com/Tips/788402/Monitor-and-Lock-in-Csharp