Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# wpf进程中按钮上的eventhandler,而任何其他单击表单都已排队_C#_Wpf - Fatal编程技术网

C# wpf进程中按钮上的eventhandler,而任何其他单击表单都已排队

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) {

。我是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;
   }

当我单击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对移动、调整大小等保持响应),然后在更新完成后重新启用“删除”按钮。您不想禁用所有事件,包括重画、调整大小等-您应该选择禁用的内容。