C# “如何制作函数的1部分”;线程等待";?
我有这个功能:C# “如何制作函数的1部分”;线程等待";?,c#,multithreading,c#-4.0,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); } 这是对键盘输入进行低级监听,我想必须是多
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);
}
通常最好的方法是使用Monitor类,它允许您锁定代码块的入口和出口: e、 g.要监视的对象:
static readonly object _locker = new object();
然后是您的代码:
lock (_locker) {
if (id.ScanCode.Length > 4) {
...
}
}
这是一个很好的参考:WndProc仅在UI线程上运行。啊。。。被一分钟打败了!保罗说的话:-)埃利维尼:谢谢你这么快就跳进来了,但是你犯了一个错误:锁(_object)而不是锁(_locker)--保罗是对的,所以我把它给了他。如果你想尝试一下,我要求你马上跟进。新的帖子。看起来很有希望,也很有效,但有时会有两个线程同时出现。有时1(好),有时2(坏)。不超过2个(可能更糟)。我将发布一个新问题,请稍后来看。:-)