C# 关于C中的触摸锁定事件#

C# 关于C中的触摸锁定事件#,c#,events,locking,volatile,raw-input,C#,Events,Locking,Volatile,Raw Input,我使用rawinput获取触摸事件,在触摸屏幕时只想做一次。这是一个例子 private volatile bool running = false; private object runLock = new object(); private void OnTouchOnHandler(object sender, EventArgs e) { lock (runLock) { if (!running)

我使用rawinput获取触摸事件,在触摸屏幕时只想做一次。这是一个例子

private volatile bool running = false;
    private object runLock = new object();
    private void OnTouchOnHandler(object sender, EventArgs e)
    {
        lock (runLock)
        {
            if (!running)
            {
                MessageBox.Show("1");
                running = true;
            }
        }
    }

当我第一次触摸屏幕三到四次时,我会收到几个消息框。真奇怪。为什么锁和易失性变量一开始不起作用?

最可能的原因是,您有多个包含
bool的对象实例正在运行
标志


lock
将阻止多个线程执行同一代码块。大多数UI操作都是在同一线程上执行的,因此允许代码重新进入同一块(
lock
在同一线程上多次获取时不会执行任何操作)。在您的例子中,简单的
bool
标志应该足够了,而不使用
lock

谢谢,我将行“running=true;”移动到“if{}的开头,它可以工作,没有锁和volatile变量。我真的对前面的结果感到困惑,它是否在不修改running标志的情况下重新进入处理程序?或者,如果存在多个实例,为什么在修改顺序时它会起作用?我猜MessageBox是半同步的—它不会移动下一行,但仍然允许处理事件。如果这是真的,您应该在原始代码中看到对调用堆栈上的
OnTouchHandler
的多个调用。