如何使 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);
}
通常最好的方法是使用监视器 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
我有这个功能:
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);
}
通常最好的方法是使用监视器 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