我有一个相当大的文本框_TextChanged
事件处理程序。在正常打字条件下,性能还不错,但当用户执行长时间连续操作时,例如按住退格按钮一次删除大量文本,它可能会明显滞后。
例如,事件需要 0.2 秒才能完成,但用户每 0.1 秒执行一次删除。因此,它无法跟上,并且需要处理的事件会积压,从而导致 UI 滞后。
但是,事件不需要针对这些中间状态运行,因为它只关心最终结果。有什么方法可以让事件处理程序知道它应该只处理最新的事件,并忽略所有以前的陈旧更改?
我已经多次遇到这个问题,根据我自己的经验,到目前为止,我发现这个解决方案简单而简洁。它是基于Windows Form
但可以转换为WPF
easily.
怎么运行的:
When TypeAssistant
得知一个text change
发生了,它就会运行一个计时器。后WaitingMilliSeconds
计时器升高Idle
事件。通过处理这个事件,你可以做任何你想做的工作(比如处理输入的文本)。如果另一个text change
发生在从计时器启动的时间开始的时间范围内,并且WaitingMilliSeconds
之后,计时器重置。
public class TypeAssistant
{
public event EventHandler Idled = delegate { };
public int WaitingMilliSeconds { get; set; }
System.Threading.Timer waitingTimer;
public TypeAssistant(int waitingMilliSeconds = 600)
{
WaitingMilliSeconds = waitingMilliSeconds;
waitingTimer = new Timer(p =>
{
Idled(this, EventArgs.Empty);
});
}
public void TextChanged()
{
waitingTimer.Change(WaitingMilliSeconds, System.Threading.Timeout.Infinite);
}
}
Usage:
public partial class Form1 : Form
{
TypeAssistant assistant;
public Form1()
{
InitializeComponent();
assistant = new TypeAssistant();
assistant.Idled += assistant_Idled;
}
void assistant_Idled(object sender, EventArgs e)
{
this.Invoke(
new MethodInvoker(() =>
{
// do your job here
}));
}
private void yourFastReactingTextBox_TextChanged(object sender, EventArgs e)
{
assistant.TextChanged();
}
}
优点:
- Simple!
- 在工作
WPF
and Windows Form
- 使用 .Net Framework 3.5+
缺点:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)