Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “如何制作函数的1部分”;线程等待";?_C#_Multithreading_C# 4.0 - Fatal编程技术网

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个(可能更糟)。我将发布一个新问题,请稍后来看。:-)