C# .net线程安全多次单击按钮

C# .net线程安全多次单击按钮,c#,.net,C#,.net,我有一件事 button.Click += ProcessClick; 我的事件处理程序ProcessClick是: private void async ProcessClick(object o, EventArgs e){ await LongOperation() } 当我快速点击按钮多次时, 如何仅处理第一个线程并跳过其他线程,直到第一个线程完成 第一次单击后禁用按钮不是解决方案 编辑:可以使用任何类型的线程构造:任务、信号量、锁等。您可以在第一次单击后删除事件,并在处理第

我有一件事

button.Click += ProcessClick;
我的事件处理程序
ProcessClick
是:

private void async ProcessClick(object o, EventArgs e){
    await LongOperation()
}
当我快速点击按钮多次时, 如何仅处理第一个线程并跳过其他线程,直到第一个线程完成


第一次单击后禁用按钮不是解决方案


编辑:可以使用任何类型的线程构造:任务、信号量、锁等。

您可以在第一次单击后删除事件,并在处理第一次单击后再次添加它

private bool longOperationRunning;

private void async ProcessClick(object o, EventArgs e){
    if (longOperationRunning)
        return;

    longOperationRunning = true;
    await LongOperation()
    longOperationRunning = false;
}

private async void button1_Click(object sender, EventArgs e)
{
    Debug.Write("Running click event");
    this.button1.Click -= button1_Click;

    await Task.Run(() => Task.Delay(5000));

    this.button1.Click += button1_Click;
}

您可以在第一次单击后删除事件,并在处理第一次单击结束时再次添加它


private async void button1_Click(object sender, EventArgs e)
{
    Debug.Write("Running click event");
    this.button1.Click -= button1_Click;

    await Task.Run(() => Task.Delay(5000));

    this.button1.Click += button1_Click;
}

你是对的。但由于“操作是否已在运行”是一种全局类型的状态(至少是当前表单实例的全局状态),因此我看不到避免它的方法。你是对的。但由于“操作是否已在运行”是一种全局类型的状态(至少是当前表单实例的全局状态),我看不出有什么办法可以避免它。“在第一次单击后禁用按钮不是一个解决方案……”——为什么不呢?这是最简单、最直接的解决方案,它与我们的跨平台移动框架相关。在我的*问题中,最好是触摸事件,而不是单击。“在第一次单击后禁用按钮不是解决方案…”——为什么不?这是最简单、最直接的解决方案,它与我们的跨平台移动框架相关。这应该是一个更好的触摸事件,而不是点击我的*问题。您甚至可以将处理程序切换到更合适的位置,例如
this.button1.Click+=showOperationAlreadyRunningMessage+1,不错。您甚至可以将处理程序切换到更合适的位置,例如
this.button1.Click+=showOperationAlreadyRunningMessage