Multithreading 仅允许最近的异步方法调用

Multithreading 仅允许最近的异步方法调用,multithreading,asynchronous,task,c#-5.0,Multithreading,Asynchronous,Task,C# 5.0,每次textbox注册textchange事件时,我都调用一个异步方法。此异步方法对文本框中的文本执行任务。问题是,当用户键入fast时,较新的异步方法可能会在之前调用异步方法之前完成 我需要做的是销毁所有以前的异步方法调用,只继续调用最近的异步方法。如何实现这一点?如果您不想使用任何第三方库,可以做两件事 第一种方法是在采取行动之前添加一个延迟,以便在发生更改时在异步方法中启动: await Task.Delay(1000); // Wait a second before getting i

每次textbox注册textchange事件时,我都调用一个异步方法。此异步方法对文本框中的文本执行任务。问题是,当用户键入fast时,较新的异步方法可能会在之前调用异步方法之前完成


我需要做的是销毁所有以前的异步方法调用,只继续调用最近的异步方法。如何实现这一点?

如果您不想使用任何第三方库,可以做两件事

第一种方法是在采取行动之前添加一个延迟,以便在发生更改时在异步方法中启动:

await Task.Delay(1000); // Wait a second before getting into the work.
第二种方法是保留对更改时创建的任务的引用。然后,当更改再次发生时,您可以等待原始任务完成后再开始新任务,或者如果愿意,在创建时向其传递CancellationToken,以便可以取消该标记并立即启动新任务

归根结底,这取决于一方不超过另一方的重要性。如果任务很关键,请等待原始任务,即使在取消任务的情况下也是如此。如果没什么大不了的,那就取消它,让它在自己的时间里放松下来


当然,如果您不需要它在UI线程中执行任何操作,请记住在等待的任何位置添加.ConfigureAwait(false)。

或使用计时器等待足够长的键入暂停时间……您需要的是反应式扩展(Rx):这正是您需要的,称为Throttle: