[英]How to start a Task using only the last trigger within x seconds?
我有一個觸發任務啟動的函數。
void function ()
{
new Task(async () =>
{
// await network operation
}).Start();
}
該函數可能會非常頻繁地被調用多次。 但我不希望任務每次都啟動,我希望它只在 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.NET 應用程序中使用此代碼時,您可以輕松地使用 async/await 來改進代碼。 但是,它確實展示了使用CancellationTokenSource
並將延遲與另一個任務相結合的基本思想。
對此的常用術語是“去抖動”,這里討論了它: C# 事件去抖動
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.