对于我的WPF应用程序,我开发了一个虚拟键盘。它在我的开发机器上运行得很好。但是,在速度较慢的机器上,按钮点击响应较慢。单击按钮后,在显示更新为按钮按下状态和按钮事件之前会有一段延迟。我可以做些什么来消除这个延迟?这个问题是WPF显示问题吗?
考虑到是事件处理程序太慢,我尝试了几种发送键盘按键事件的方法。无论我尝试过什么,交互仍然很慢。目前我使用的是:
SendInput(uint nInputs, ref INPUT pInputs, int cbSize);
从user32.dll导入。我的事件处理程序被简化到只为上面的函数创建和调用参数的程度。
我也尝试过使用以下代码,但没有获得更好的性能:
System.Windows.Input.Keyboard.FocusedElement.RaiseEvent(...)
我怎样才能摆脱延迟呢?
发布于 2009-12-12 06:21:10
你能说出是什么原因导致你的延迟吗?
如果您的Click
事件中有一些缓慢的东西,您可能希望使用单独的Thread
来执行代码。在新线程中,如果您有必须在UI线程上执行的代码,请使用Dispatcher.BeginInvoke
将其排入队列,以便在UI有处理时间时执行。为了保持UI的响应性,您需要将任何繁重的代码放在主(UI)线程之外。
如果您的虚拟键盘是某个Window
的本地键盘,根据您正在做的事情的复杂程度,您可以使用an approach I've used in the past,您只需手动将键盘字符填充到具有焦点的TextBox
中。
免责声明:我在两年前写了这段代码,结果我讨厌它。虽然我通常会假装它不存在,但它可能会对你有所帮助。从那时起,我对其进行了改进,但这个概念本身在速度较慢的机器上没有性能问题。我会引用Jeff Atwood的博客关于你最讨厌的代码是你自己的代码,但是,嗯……
编辑:由于即使在Click
为空的情况下仍然存在问题,您可能需要查看其他潜在的问题。用户的CPU是否因某件事而达到100%的最大值?要么是太重的动画,要么是另一个潜在的事件?大多数UI延迟通常是由于CPU耗尽或事件在UI的线程上花费太长时间造成的。
一种可能性是,如果你的Window
有AllowsTransparency="True"
,大部分的工作负载通常都会进入显卡will now be rendered in software, and can have heavy performance penalties.,你可以看看微软在Optimizing WPF Application Performance上的这篇文章,找到一些可以加速你的处理速度的一般技巧。
我建议任何使用XAML进行开发的人阅读上一篇文章。这些小细节之间的性能差异,比如使用TextBlock
与Label
,或者实现DependencyProperty
与INotifyPropertyChanged
之间的差异,确实可以加起来,而且它们针对每种情况进行基准测试的事实确实表明了适当设计的重要性。
发布于 2012-12-22 02:12:25
正好碰上了这个讨论。我有一个WinForms应用程序,它的按钮响应很慢。这发生在我升级到64位Windows7之后,我发现如果我把项目目标改为"x86“(而不是"Any CPU"),缓慢的按钮响应就消失了。
发布于 2009-12-12 06:16:42
如果您的事件处理程序需要很长时间才能完成,它将在该时间锁定UI。尝试此事件处理程序:
private void button1_Click(object sender, RoutedEventArgs e)
{
System.Threading.Thread.Sleep(5000);
}
您的事件处理程序可能只是在速度更快的机器上完成得更快。对于较慢的操作,您可能希望将工作推送到另一个线程。
https://stackoverflow.com/questions/1891138
复制相似问题