如您在此代码中看到的:

public async void TaskDelayTest()
{
     while (LoopCheck)
     {
          for (int i = 0; i < 100; i++)
          {
               textBox1.Text = i.ToString();
               await Task.Delay(1000);
          }
     }
}

我希望它在一秒钟内将文本框设置为i的字符串值,直到将LoopCheck值设置为false为止。但是它的作用是为所有对象创建所有迭代对象,即使我将LoopCheck值设置为false,它仍然会异步执行。

我想在设置Task.Delay()时取消所有等待的LoopCheck=false迭代。如何取消呢?

最佳答案

使用Task.Delayoverload接受CancellationToken

public async Task TaskDelayTest(CancellationToken token)
{
    while (LoopCheck)
    {
        token.throwIfCancellationRequested();
        for (int i = 0; i < 100; i++)
        {
            textBox1.Text = i.ToString();
            await Task.Delay(1000, token);
        }
    }
}

var tokenSource = new CancellationTokenSource();
TaskDelayTest(tokenSource.Token);
...
tokenSource.Cancel();

10-05 22:57