我有这个功能:
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就可以进入并执行。如果它可能和简单,所有其他线程也可以被中止,因为当线程到达这一点时,其他线程变得无用。但如果这很难或可能导致不稳定,那就让我们坚持原来的要求。
实现这一目标的最简单方法是什么? (先谢谢!)
答案 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);
}
答案 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