如何在x秒内仅使用最后一个触发器启动任务
本文关键字:最后一个 触发器 启动 任务 | 更新日期: 2023-09-27 18:03:50
我有一个触发Task启动的函数。
void function ()
{
new Task(async () =>
{
// await network operation
}).Start();
}
函数可以被非常频繁地调用多次。但是我不希望每次都启动Task,我希望它只在最后一次触发时启动,比如在5秒内。
下面是我想要做的步骤
- 函数被调用
- 设置5秒的延迟
- 如果函数()在这5秒内被调用,我希望取消所有挂起的任务,并重新开始5秒的延迟
- 如果函数()在这5秒内没有被调用,那么我希望开始任务
请指导我如何在c# .NET 4.5中做到这一点
下面的代码显示了一个简单的控制台应用程序,它在5秒后运行一个任务,并在新任务启动时取消当前任务:
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Starting");
Console.WriteLine("Press any key to call method or press Esc to cancel");
do
{
Method();
} while (Console.ReadKey(true).Key != ConsoleKey.Escape);
}
static Task delayTask = null;
static CancellationTokenSource cancellationTokenSource = null;
static void Method()
{
Console.WriteLine("Method called");
if (delayTask != null)
{
cancellationTokenSource.Cancel();
}
cancellationTokenSource = new CancellationTokenSource();
delayTask = Task.Delay(5000, cancellationTokenSource.Token);
delayTask.ContinueWith((t) => {
Console.WriteLine("Task running...");
}, TaskContinuationOptions.NotOnCanceled);
}
}
代码没有使用async/await,因为这些在控制台应用程序中不容易使用(控制台应用程序没有SynchronizationContext
)。当在WinForms, WPF或ASP. js中使用此代码时。NET应用程序可以很容易地使用async/await来改进代码。然而,它确实展示了使用CancellationTokenSource
并将延迟与另一个任务相结合的基本思想。
这方面的一个常用术语是" debounce",这里讨论的是:c#事件debounce