延迟后触发动作

时间:2016-08-20 17:57:32

标签: c# async-await xamarin.forms

我在Xamarin.Forms项目的OnTextChanged事件中有以下代码:

async void OnTextChanged(object sender, TextChangedEventArgs e)
        {

            if (this.txtClientFilter.Text.Length > 4)
            {
                var client_list= App.ClientManager.GetTasksAsync(txtClientFilter.Text);
                var template = new DataTemplate(typeof(TextCell));

                template.SetBinding(TextCell.DetailProperty, "nom_ct");
                template.SetBinding(TextCell.TextProperty, "cod_ct");

                listview.ItemTemplate = template;
                listview.ItemsSource = await client_list;

            }
        }

如您所见,几乎每个按键都试图发出请求(通过GetTaskAsync方法)。我不想解雇每一个按键,我想在1000毫秒内忽略一些按键。

我该怎么做?我发现了一些使用Task.Delay()但没有按预期工作的例子。

2 个答案:

答案 0 :(得分:3)

    private int taskId = 0;

    private async void ExecAutoComplete()
    {
        var client_list = App.ClientManager.GetTasksAsync(txtClientFilter.Text);
        var template = new DataTemplate(typeof(TextCell));

        template.SetBinding(TextCell.DetailProperty, "nom_ct");
        template.SetBinding(TextCell.TextProperty, "cod_ct");

        listview.ItemTemplate = template;
        listview.ItemsSource = await client_list;
    }

    private void TryExecute(int taskId)
    {
        if (this.taskId == taskId)
            this.Invoke((MethodInvoker)(ExecAutoComplete));
    }

    private async void OnTextChanged(object sender, TextChangedEventArgs e)
    {
        ++taskId;
        Task.Delay(1000).ContinueWith(t =>  TryExecute(taskId));
    }

我们会在每个taskId上创建唯一的textChange,如果在1000毫秒taskId之后保持不变(不再更改文字),我们会执行实际调用。

答案 1 :(得分:0)

在您的页面上创建_lastClickTime类型为DateTime的私有属性,并将其添加到按钮单击处理程序的开头:

if (DateTime.Now - _lastClickTime < new TimeSpan(0, 0, 0, 0, 1000))
{
    return;
}
_lastClickTime = DateTime.Now;

我误解了你的问题吗?