每次文本框注册 textchange 事件时,我都会调用一个异步方法。此异步方法对文本框中的文本执行任务。问题在于,当用户快速键入时,更新的异步方法可能会在它之前调用的异步方法之前完成。
我需要做的是销毁所有以前的异步方法调用,只继续调用最近的。我如何实现这一目标?
每次文本框注册 textchange 事件时,我都会调用一个异步方法。此异步方法对文本框中的文本执行任务。问题在于,当用户快速键入时,更新的异步方法可能会在它之前调用的异步方法之前完成。
我需要做的是销毁所有以前的异步方法调用,只继续调用最近的。我如何实现这一目标?
如果您不想使用任何第三方库,您可以做两件事。
第一个是在采取行动之前添加延迟,因此在您的异步方法中,您在发生更改时开始:
await Task.Delay(1000); // Wait a second before getting into the work.
第二个是保留对您在更改时创建的任务的引用。然后,当再次发生更改时,您可以等待原始任务完成,然后再开始新任务,或者如果您愿意,可以在创建它时传递一个 CancellationToken 以便您可以取消该令牌并立即启动新任务.
最终,它归结为一个不超过另一个的重要性。如果它很关键,请等待原始任务,即使在您取消它的情况下也是如此。如果它无关紧要,那么只需取消它并让它在自己的时间结束。
当然,如果您不需要它在 UI 线程中执行任何操作,请记住在您等待的任何位置添加 .ConfigureAwait(false)。