延迟后触发动作

本文关键字:延迟 | 更新日期: 2023-09-27 18:03:19

我有以下代码在一个Xamarin的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()的例子,但没有像预期的那样工作。

延迟后触发动作

    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));
    }

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

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

if (DateTime.Now - _lastClickTime < new TimeSpan(0, 0, 0, 0, 1000))
{
    return;
}
_lastClickTime = DateTime.Now;
我误解你的问题了吗?