gpt4 book ai didi

c# - 使用 CancellationToken 打破循环

转载 作者:行者123 更新时间:2023-12-02 17:56:40 25 4
gpt4 key购买 nike

我有一个函数,它在 while 循环中每 100 毫秒打印一个数字。我想通过CancellationToken结束这个循环,但它并没有结束。

我的功能:

 public async void writeAsync(CancellationToken ct)
{
int numberOfWrite = 0;
while(!ct.IsCancellationRequested)
{
numberOfWrite++;
Console.WriteLine(numberOfWrite);
Thread.Sleep(100);
}
}

调用函数:

 CancellationTokenSource _cts = new CancellationTokenSource();
writeAsync( _cts.Token);
Thread.Sleep(1000);
_cts.Cancel();

我希望这个数字只打印 10 次,但打印时没有终止。谁能帮我解决这个问题?

最佳答案

在您的程序中,Thread.Sleep(1000) 和 _cts.Cancel() 永远不会执行。因为您的函数中有一个无限循环,并且您的程序以同步模式运行。

解决这个问题有两种方法:

  1. 在运行 writeAsync( _cts.Token) 之前为 CancellationTokenSource 设置 CancelAfter:

    CancellationTokenSource _cts = new CancellationTokenSource();
    _cts.CancelAfter(TimeSpan.FromSeconds(1));
    writeAsync(_cts.Token);
  2. 使用 task.Run() 运行 writeAsync() 函数 Async :

    CancellationTokenSource _cts = new CancellationTokenSource();
    Task.Run(() => writeAsync(_cts.Token));
    Thread.Sleep(1000);
    _cts.Cancel();

注意:

writeAsync函数其实是非async,是否async对这个函数没有影响

关于c# - 使用 CancellationToken 打破循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75571894/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com