【发布时间】:2021-01-29 11:57:19
【问题描述】:
我一直在修补 Blazor,但遇到了异步/等待问题。我添加了一个搜索输入字段,该字段触发异步操作,当用户开始输入时,该操作会向用户返回搜索结果。问题是异步任务以错误的顺序完成。触发的第一个任务返回并使已完成的后续任务的结果无效。
我提出了一个涉及跟踪任务的解决方案,但这是正确的做法还是我做错了?
我目前的解决方案是这样的:
private List<Task> runningTasks = new List<Task>();
protected async Task OnSearchTermChanged(ChangeEventArgs e)
{
SearchTerm = e.Value.ToString();
if(SearchTerm.Length >= 3)
{
SearchResult = null;
var task = AdService.SearchUsers(SearchTerm);
runningTasks.Add(task);
var result = await task;
if(task == runningTasks.Last())
{
SearchResult = result;
}
}
else
{
SearchResult ??= new List<AdUser>();
SearchResult.Clear();
}
}
【问题讨论】:
-
你怎么知道一个任务是“最后一个”?用户键入时不会添加更多任务吗?
-
我相信您的方法是正确的——您确实需要跟踪任务并检查刚刚完成的任务是否是最新的。我只能建议只存储最后运行的任务而不是整个列表。您也可以考虑在开始新任务之前取消之前的任务。
-
您真正想要实现什么?总是最后触发的查询结果很重要 - 所以可以删除较早的查询,或者您需要所有触发请求的结果?
-
我相信Task.WhenAll 可以帮助你。 Task.WhenAll 在所有其他任务完成后返回一个任务,因此您可以等待
-
你也可以有一个计时器,所以在改变(击键)之后会有一点延迟(可能是 0.5 到 1 秒),然后再做任何事情,然后如果用户输入 10 个字母快速连续事件仅触发最后一个字母,而不是 10 次。
标签: c# async-await blazor