如何在x秒内仅使用最后一个触发器启动任务

本文关键字:最后一个 触发器 启动 任务 | 更新日期: 2023-09-27 18:03:50

我有一个触发Task启动的函数。

void function ()
{
  new Task(async () =>
  {
    // await network operation
  }).Start();
}

函数可以被非常频繁地调用多次。但是我不希望每次都启动Task,我希望它只在最后一次触发时启动,比如在5秒内。

下面是我想要做的步骤

  1. 函数被调用
  2. 设置5秒的延迟
  3. 如果函数()在这5秒内被调用,我希望取消所有挂起的任务,并重新开始5秒的延迟
  4. 如果函数()在这5秒内没有被调用,那么我希望开始任务

请指导我如何在c# .NET 4.5中做到这一点

如何在x秒内仅使用最后一个触发器启动任务

下面的代码显示了一个简单的控制台应用程序,它在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