C# wpf进程中按钮上的eventhandler,而任何其他单击表单都已排队
。我是WPF的新手,对事件处理程序的队列有一个问题。在我使用WPF开发的应用程序中,单击一个按钮就可以得到以下代码C# wpf进程中按钮上的eventhandler,而任何其他单击表单都已排队,c#,wpf,C#,Wpf,。我是WPF的新手,对事件处理程序的队列有一个问题。在我使用WPF开发的应用程序中,单击一个按钮就可以得到以下代码 private void ButtonUpdate_Click(object sender, RoutedEventArgs e) { try { Cursor = Cursors.Wait; Processor.UpdateData(); } catch (RemoteConnection x) {
private void ButtonUpdate_Click(object sender, RoutedEventArgs e)
{
try
{
Cursor = Cursors.Wait;
Processor.UpdateData();
}
catch (RemoteConnection x)
{
ShowConnectionError(this, x);
}
finally
{
Cursor = Cursors.Arrow;
}
当我单击this按钮时,Processor.UpdateData()方法开始处理,光标设置为小时刻度。同时,如果用户按下屏幕上的任何其他按钮或在文本框中键入,则在处理上述事件处理程序后立即执行。这些事件似乎在调度程序队列中排队。您能帮我避免这种情况吗?为了避免这种情况,即当一个事件正在进行时,用户不应该能够单击或生成另一个事件,您可以做的事情如下
private void ButtonUpdate_Click(object sender, RoutedEventArgs e)
{
//disable button here so no more clicking until processing is done
//start a backgroundworker that will do the processing
}
BackgroundWorker()
{
try
{
Cursor = Cursors.Wait;
Processor.UpdateData();
}
catch (RemoteConnection x)
{
ShowConnectionError(this, x);
}
finally
{
Cursor = Cursors.Arrow;
//enable button again using Dispatcher
}
}
你到底想避免什么?从根本上说,在很长的时间内阻止UI线程是个坏主意。最好禁用您不想引发事件的任何控件,然后在其他线程上启动工作。完成后,使用<代码>调度器< /代码>将其返回到UI线程,更新UI,然后重新启用禁用的控件。乔恩,考虑示例,如果用户按“更新”按钮,则更新并执行“更新按钮”事件处理程序。现在,如果用户按下Delete按钮,那么在完成更新之后,Delete按钮的事件处理程序将立即启动。我想避免一个按钮的事件处理程序正在执行,同时不会引发其他事件(如文本框中的按键或按钮单击)。@GeekM:完全按照我的建议来避免这种情况:禁用删除按钮,在其他线程上启动更新工作(以便UI对移动、调整大小等保持响应),然后在更新完成后重新启用“删除”按钮。您不想禁用所有事件,包括重画、调整大小等-您应该选择禁用的内容。