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代码>。