延迟后触发动作
本文关键字:延迟 | 更新日期: 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;
我误解你的问题了吗?