WPF应用程序中的慢按钮响应

时间:2009-12-11 22:00:16

标签: c# wpf event-handling button virtual-keyboard

对于我的WPF应用程序,我开发了一个虚拟键盘。它在我的开发机器上运行良好。但是,在较慢的机器上,按钮单击响应很慢。单击按钮后,在按钮按下状态和按钮事件更新显示之前有一段延迟。我该怎么做才能消除这种延迟?问题是WPF显示问题吗?

认为事件处理程序很慢,我尝试了几种方法来发送键盘按键事件。无论我尝试过什么,互动仍然很慢。目前我正在使用:

SendInput(uint nInputs, ref INPUT pInputs, int cbSize);

从user32.dll导入。我的事件处理程序被简化到只为其创建参数并调用上述函数的地步。

我也试过使用以下内容,但没有更好的表现:

 System.Windows.Input.Keyboard.FocusedElement.RaiseEvent(...)

如何摆脱延迟?

3 个答案:

答案 0 :(得分:3)

你能说出导致延误的原因吗?

如果Click事件中的某些内容有问题,您可能需要使用单独的Thread来执行代码。在新线程中,如果您有必须在UI线程上执行的代码,请使用Dispatcher.BeginInvoke对其进行排队,以便在UI处理时间时执行。为了保持UI响应,您需要保留主(UI)线程中的任何重代码。

如果您的虚拟键盘是某个Window的本地键盘,根据您正在执行的操作的复杂程度,您可以在an approach I've used in the past处手动将键盘字符填入{{1}有焦点的。

免责声明:我在2年前编写了该代码并因此而讨厌它。虽然我通常假装它不存在,但它可能会帮助你。从那时起我就做得更好了,但这个概念本身在较慢的机器上没有性能问题。我引用杰夫阿特伍德的博客关于你最讨厌的代码是你自己的代码,但是,好吧......

修改:由于即使TextBox为空也仍然存在问题,您可能需要查看其他潜在的问题。用户的CPU最大值是100%吗?要么是太重的动画,还是其他潜在的事件?大多数UI延迟通常是由于CPU的最大化或者在UI的线程上花费的时间太长而导致的。

一种可能性是,如果您的ClickWindow,通常会进入显卡的大部分工作量will now be rendered in software, and can have heavy performance penalties.过去,您可以查看此微软文章Optimizing WPF Application Performance提供一些可以加快处理速度的一般提示。

我建议任何在XAML中开发的人阅读上一篇文章。这些小细节(例如使用AllowsTransparency="True"TextBlock或实施Label与vs. DependencyProperty)之间的性能差异确实可以加起来,而事实是他们对每个人进行基准测试确实显示了正确设计的重要性。

答案 1 :(得分:2)

刚刚讨论过这个问题。我有一个WinForms应用程序,按钮响应很慢。这是在我升级到64位Windows 7之后发生的。我发现如果我将项目目标更改为“x86”(而不是“任何CPU”),则慢速按钮响应会消失。

答案 2 :(得分:1)

如果您的事件处理程序需要很长时间才能完成,那么它将锁定该时间段的UI。试试这个 事件处理程序:

  private void button1_Click(object sender, RoutedEventArgs e)
  {
     System.Threading.Thread.Sleep(5000);
  }

您的事件处理程序可能只是在更快的机器上更快完成。对于慢速操作,您可能希望将工作推送到另一个线程。