我在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()但没有按预期工作的例子。
答案 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;
我误解了你的问题吗?