【问题标题】:eventhandler on button in wpf process while any other click on form is queuedwpf进程中按钮上的事件处理程序,而对表单的任何其他单击都排队
【发布时间】:2011-08-17 12:36:05
【问题描述】:

。我对 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() 方法开始处理并且光标设置为沙漏。与此同时,如果用户按下屏幕上的任何其他按钮或在文本框中键入,则在处理上述事件处理程序后立即完成。这些事件似乎在调度程序队列中排队。你能帮我避免这种情况吗?

【问题讨论】:

    标签: c# wpf


    【解决方案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
           }
       }
    

    【讨论】:

      【解决方案2】:

      究竟你想避免什么?从根本上说,长时间阻塞 UI 线程是个坏主意。最好禁用您不想引发事件的任何控件,然后在不同的线程上启动工作。完成后,使用Dispatcher 封送回 UI 线程,更新 UI,然后重新启用之前禁用的控件。

      【讨论】:

      • 乔恩,考虑这个例子,如果用户按下更新按钮,则更新按钮点击的事件处理程序被引发并执行。现在,如果用户在完成更新后立即按下删除按钮,则会引发删除按钮的事件处理程序。我想避免一个按钮的事件处理程序正在执行并且同时没有其他事件被引发(如文本框中的 key_press 或按钮单击)的情况。
      • @GeekM:完全按照我的建议可以避免这种情况:禁用删除按钮,在不同的线程上启动更新工作(以便 UI 保持对移动、调整大小等的响应),然后重新- 更新完成后启用删除按钮。您不想禁用 所有 事件,包括重绘、调整大小等 - 您应该对禁用的内容有所选择。
      猜你喜欢
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多