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

时间:2013-03-25 20:40:36

标签: c# wpf asynchronous time delay

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

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

为了提高效率,每次Text更改时都无法执行此代码块,因为它有点耗时。理想情况下,每次用户启动和停止键入时都应调用一次。我已经开始在Restart()方法中使用StopwatchOnTextChanged

这是我的设置:

public class MyBox : TextBox
{
    private readonly Stopwatch timer;

    protected override void OnTextChanged(TextChangedEventArgs e)
    {
        timer.Restart();

        base.OnTextChanged(e);
    }
}

我该如何有效地做到这一点?异步线程的答案是什么?或者还有其他方式吗?

3 个答案:

答案 0 :(得分:7)

您可以轻松地使用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
    }
}

答案 1 :(得分:1)

使用Delay绑定。样品:

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

答案 2 :(得分:0)

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

注意:如果您的代码需要与UI线程进行交互,那么您必须确保调用回主线程,或者使用基本上为您执行此操作的“UpdateStatus”调用。

或者,你的计时器方法会起作用,但是当它执行时需要注意,主线程将被锁定直到它完成,因此我的第一个建议是终止线程。