.net线程安全点击按钮很多

时间:2015-02-26 09:53:04

标签: c# .net

我有活动

button.Click += ProcessClick;

我的事件处理程序ProcessClick是:

private void async ProcessClick(object o, EventArgs e){
    await LongOperation()
}

当我快速点击按钮多次时, 如何只处理第一个线程并跳过其他线程,直到第一个线程完成?

首次点击后禁用按钮不是解决方案......

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

2 个答案:

答案 0 :(得分:6)

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


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;
}

答案 1 :(得分:1)

private bool longOperationRunning;

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

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