簡體   English   中英

如何在 x 秒內僅使用最后一個觸發器啟動任務?

[英]How to start a Task using only the last trigger within x seconds?

我有一個觸發任務啟動的函數。

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

該函數可能會非常頻繁地被調用多次。 但我不希望任務每次都啟動,我希望它只在 5 秒內的最后一個觸發器上啟動。

以下是我想要做的事情的步驟

  1. function() 被調用
  2. 延遲 5 秒
  3. 如果 function() 在這 5 秒內被調用,我希望取消任何掛起的任務,並重新開始 5 秒的延遲
  4. 如果在這 5 秒內沒有調用 function(),那么我希望啟動任務

請指導我如何在 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.NET 應用程序中使用此代碼時,您可以輕松地使用 async/await 來改進代碼。 但是,它確實展示了使用CancellationTokenSource並將延遲與另一個任務相結合的基本思想。

對此的常用術語是“去抖動”,這里討論了它: C# 事件去抖動

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM