如何制作一部分功能"线程等待"?

时间:2015-02-06 17:53:04

标签: c# multithreading c#-4.0

我有这个功能:

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-block一次只允许1个线程。一旦线程#1完成,线程#2就可以进入并执行。如果它可能和简单,所有其他线程也可以被中止,因为当线程到达这一点时,其他线程变得无用。但如果这很难或可能导致不稳定,那就让我们坚持原来的要求。

实现这一目标的最简单方法是什么? (先谢谢!)

2 个答案:

答案 0 :(得分:3)

确保一次只有一个线程进入临界区的最简单方法是使用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

答案 1 :(得分:1)

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

e.g。要监控的对象:

static readonly object _locker = new object();   

然后你的代码:

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

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