c#用户输入后的时间延迟

本文关键字:时间延迟 输入 用户 | 更新日期: 2023-09-27 18:05:54

我有一个自定义控件(继承自TextBox),我正在使用。net 4.0

我需要能够做的是在用户完成输入后执行一些代码,例如在他停止输入后一秒钟。

我不能在每次Text改变的时候都执行这个代码块,为了效率,因为它有点耗时。理想情况下,它应该只在每次用户开始和停止输入时调用一次。我已经开始在OnTextChanged方法中使用Stopwatch的Restart()

这是我的设置:

public class MyBox : TextBox
{
    private readonly Stopwatch timer;
    protected override void OnTextChanged(TextChangedEventArgs e)
    {
        timer.Restart();
        base.OnTextChanged(e);
    }
}

我怎样才能有效地做到这一点?异步线程是答案吗?还是有别的办法?

c#用户输入后的时间延迟

您可以轻松地使用DispatcherTimer:

public class MyBox : TextBox
{
    private readonly DispatcherTimer timer;
    public MyBox()
    {
        timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
        timer.Tick += OnTimerTick;
    }
    protected override void OnTextChanged(TextChangedEventArgs e)
    {
        timer.Stop();
        timer.Start();
    }
    private void OnTimerTick(object sender, EventArgs e)
    {
        timer.Stop();
        // do something here
    }
}

使用延迟绑定。示例:

<StackPanel>
    <TextBox Text="{Binding ElementName=TextBlock, 
                            Path=Text, 
                            Delay=1000}" />
    <TextBlock x:Name="TextBlock" />
</StackPanel>

如果你的代码可以在一个单独的线程上运行,那么设计你的线程代码,这样它就可以通过杀死线程而被杀死。然后在每次按键时,杀死旧线程(如果它存在),用你的代码重新启动一个新线程。

注意:如果你的代码需要与UI线程交互,那么你必须确保调用回主线程,或者使用'UpdateStatus'调用,基本上为你做这些。

或者,你的计时器方法将工作,但有一个警告,当它执行时,主线程将被锁定,直到它完成,因此我的第一个建议是一个可终止线程。