如何取消等待 Task.Delay()? [英] How to cancel await Task.Delay()?

查看:66
本文介绍了如何取消等待 Task.Delay()?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

正如你在这段代码中看到的:

As you can see in this code:

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,它仍然会异步执行它的操作.

I want it to set textbox to string value of i with one second period until I set LoopCheck value to false . But what it does is that it creates all iteration ones in for all and even if I set LoopCheck value to false it still does what it does asyncronously.

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

I want to cancel all awaited Task.Delay() iteration when I set LoopCheck=false. How can I cancel it?

推荐答案

使用 重载Task.Delay 接受 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();

这篇关于如何取消等待 Task.Delay()?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆