在wpf进程中的按钮上的eventhandler,而窗体上的任何其他单击都排队

时间:2011-08-17 12:36:05

标签: c# wpf

。我对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()开始处理,光标设置为小时玻璃。现在,与此同时,如果用户按下屏幕上的任何其他按钮或键入文本框,则在处理上述事件处理程序后立即执行此操作。看来这些事件在调度程序队列中排队。你能帮我避免这种情况吗?

2 个答案:

答案 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,然后重新启用之前禁用的控件。