。我对WPF很新,并且对事件处理程序的排队有疑问。在我使用WPF开发的应用程序中,单击按钮时会出现以下代码
private void ButtonUpdate_Click(object sender, RoutedEventArgs e)
{
try
{
Cursor = Cursors.Wait;
Processor.UpdateData();
}
catch (RemoteConnection x)
{
ShowConnectionError(this, x);
}
finally
{
Cursor = Cursors.Arrow;
}
单击此按钮时,方法Processor.UpdateData()开始处理,光标设置为小时玻璃。现在,与此同时,如果用户按下屏幕上的任何其他按钮或键入文本框,则在处理上述事件处理程序后立即执行此操作。看来这些事件在调度程序队列中排队。你能帮我避免这种情况吗?
答案 0 :(得分:1)
为了避免这种情况,即用户不应该在已经进行的情况下点击或生成另一个事件,你可以做的就是这样的事情
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
}
}
答案 1 :(得分:1)
你想要避免什么完全?从根本上说,在任何相当长的时间内阻止UI线程是个坏主意。最好禁用任何不想引发事件的控件,然后在不同的线程上启动工作。完成后,使用Dispatcher
封送回UI线程,更新UI,然后重新启用之前禁用的控件。