如何使用代码停止执行方法

时间:2012-07-18 15:36:45

标签: c# asp.net-mvc

我的控制器中有一个方法,我用ajax调用。 可以经常调用该方法(取决于用户键入的速度)。 用户键入字母,单词。我希望在用户停止输入后调用该方法。

方法的参数是用户的书面文字。

按照我的方式,该方法会在很短的时间内被调用很多次。

有没有办法总是调用方法(在每个字母之后),但是如果立即调用它,那么该方法会立即停止执行?

示例:用户将缓慢写入10个字母 - 该方法将被调用10次。 示例:用户将快速写入10个字母 - 该方法将被调用第10次或该方法将被调用10次,但将停止执行前9次并仅完成第10次执行

3 个答案:

答案 0 :(得分:3)

假设您使用AJAX调用它,那么我认为您最好放置逻辑客户端。考虑使用像throttle.js这样的东西,它只会在输入暂停后发布Ajax调用。

答案 1 :(得分:0)

你可以通过缓冲结果来实现这一目标。将它们传递给这个方法。基本上,通过将此方法包装在聚合器方法中,您可以防止此操作始终触发。

//... Class Impl

private string keys = String.Empty;
private readonly TimeSpan bufferDelay = new TimeSpan(100000);
private DateTime lastKeyPress = DateTime.UtcNow;

private void DoSomething(string text)
{
//do something to process text.
    keys = String.Empty;

}


public void DoSomethingBuffer(string text)
{
    keys =+ text;
    var now = DateTime.UtcNow;
    if((now-lastKeyPress) > bufferDelay)
{
    DoSomething(keys);
}
    lastKeyPress = now;

}
//... More Class Impl

您需要使用聚合时间窗口来查找感觉自然的东西,但它应该相对简单。你将直接调用DoSOmethingBuffer而不是DoSomethign。

答案 2 :(得分:0)

您可以使用javascript计时器完成此操作。这是一个示例,一旦自用户的最后一次按键后半秒钟就会触发任何逻辑。 如果用户继续输入,则定时器将不断被取消:

$(function() {
    var timer;
    $(".typeAhead").keypress(function() {
        if (timer != null)
            clearTimeout(timer);
        timer = setTimeout(function() {
            // do ajax call
        }, 500);
    });
});

此代码段使用jquery,但如果没有它,则可以执行此操作。只需使用getElementById()代替选择器。