Comme vous pouvez le voir dans ce code:
public async void TaskDelayTest()
{
while (LoopCheck)
{
for (int i = 0; i < 100; i++)
{
textBox1.Text = i.ToString();
await Task.Delay(1000);
}
}
}
Je veux qu'il définisse textbox avec la valeur de chaîne i
avec un délai d'une seconde jusqu'à ce que je définisse la valeur LoopCheck
sur false
. Mais ce qu’il fait, c’est qu’il crée toutes les itérations pour tous et même si je mets la valeur LoopCheck sur false, il fait toujours ce qu’il fait de manière asynchrone.
Je souhaite annuler toutes les itérations Task.Delay()
attendues lorsque je définis LoopCheck=false
. Comment puis-je l'annuler?
Utilisez le overload of Task.Delay
qui accepte une CancellationToken
public async void TaskDelayTest(CancellationToken token)
{
while (LoopCheck)
{
for (int i = 0; i < 100; i++)
{
textBox1.Text = i.ToString();
await Task.Delay(1000, token);
}
}
}
...
var tokenSource = new CancellationTokenSource();
TaskDelayTest(tokenSource.Token);
...
// cancelling
LoopCheck = false;
tokenSource.Cancel();
Si vous voulez interroger, interrogez sur une CancellationToken
:
public async Task TaskDelayTestAsync(CancellationToken token)
{
for (int i = 0; i < 100; i++)
{
textBox1.Text = i.ToString();
await Task.Delay(TimeSpan.FromSeconds(1), token);
}
}
Pour plus d'informations, voir documentation d'annulation .
using System;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static DateTime start;
static CancellationTokenSource tokenSource;
static void Main(string[] args)
{
start = DateTime.Now;
Console.WriteLine(start);
TaskDelayTest();
TaskCancel();
Console.ReadKey();
}
public static async void TaskCancel()
{
await Task.Delay(3000);
tokenSource?.Cancel();
DateTime end = DateTime.Now;
Console.WriteLine(end);
Console.WriteLine((end - start).TotalMilliseconds);
}
public static async void TaskDelayTest()
{
tokenSource = new CancellationTokenSource();
try
{
await Task.Delay(2000, tokenSource.Token);
DateTime end = DateTime.Now;
Console.WriteLine(end);
Console.WriteLine((end - start).TotalMilliseconds);
}
catch (TaskCanceledException ex)
{
Console.WriteLine(ex.Message);
}
finally
{
tokenSource.Dispose();
tokenSource = null;
}
}
}
}