web-dev-qa-db-fra.com

Comment annuler en attente de Task.Delay ()?

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?

17
Zgrkpnr

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();
24
James

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 .

8
Stephen Cleary
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;
            }
        }
    }
}
0
Hainan Dao