1. Таймер
using System;
using System.Threading;
using System.Threading.Tasks;
{
Console.WriteLine("Сейчас стартанёт таймер");
// Стартанёт таймер через секунду и он будет тикать каждые 3 секунды
using var timer = new Timer(_ => Console.WriteLine("Tick!"), null, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(3));
await Task.Delay(TimeSpan.FromSeconds(10));
}
Console.WriteLine("Таймер больше не тикает");
await Task.Delay(TimeSpan.FromSeconds(10));
Console.WriteLine("В чём мы и убедились");
2. Task.Delay
var cts = new CancellationTokenSource();
var cancellationToken = cts.Token;
Console.WriteLine("Сейчас начнёт тикать, но через 10 секунд перестанет");
cts.CancelAfter(TimeSpan.FromSeconds(10));
var task = Task.Run(async () =>
{
while (!cancellationToken.IsCancellationRequested)
{
cancellationToken.ThrowIfCancellationRequested();
Console.WriteLine("Tick!");
await Task.Delay(TimeSpan.FromSeconds(3), cancellationToken);
}
}
);
try {await task;} catch(OperationCanceledException){}
Console.WriteLine("Больше не тикает");
await Task.Delay(TimeSpan.FromSeconds(5));
Console.WriteLine("В чём мы и убедились");
Вариант с таймером лично мне нравится больше.