gpt4 book ai didi

c# - 当取消请求返回 true 时如何做 sthg?

转载 作者:行者123 更新时间:2023-11-30 14:23:07 27 4
gpt4 key购买 nike

下面的代码开始计数,3 秒后,它会打印“i”变量的值。该程序打印变量,但未以我想要的样式打印。它不会在 if (token.IsCancellationRequested) 部分下打印 Console.Writeline 语句。我认为程序在取消请求为真时直接退出。当取消请求为真时,我是否可以打印出该 console.writeline 语句?

using System;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApplication17
{
class Program
{
private static void Stop(CancellationTokenSource src)
{
Thread.Sleep(3000);
src.Cancel();
}

static void Count(CancellationToken token)
{
for (int i = 0; i < 100000; i++)
{
Console.WriteLine(i);
Thread.Sleep(80);

if (token.IsCancellationRequested)
{
Console.WriteLine("Current number is :" + i.ToString());
break;
}
else
{
Console.Clear();
}

}
}
static void Main(string[] args)
{
CancellationTokenSource src1 = new CancellationTokenSource();
CancellationToken tkn1 = new CancellationToken();

var task1 = Task.Run(() => Count(tkn1), tkn1);
var task2 = Task.Run(() => Stop(src1));
task2.Wait();

}
}
}

最佳答案

您的 token 已与 CancellationTokenSource 断开连接:

CancellationTokenSource src1 = new CancellationTokenSource();
CancellationToken tkn1 = new CancellationToken();

如您所见 - 您只需创建与源代码无关的新 token 。因此,当您请求取消 token 源时 - 它不会以任何方式影响该 token 。而不是创建新 token - 使用来自源的 token :

CancellationToken tkn1 = src1.Token;

注意这里还有一个竞争条件:

var task1 = Task.Run(() => Count(tkn1), tkn1);
var task2 = Task.Run(() => Stop(src1));
task2.Wait();

您正在等待 task2 完成,在该进程立即退出之后。 task2 是请求 token 取消的任务。 token 被取消后,您的循环可能需要最多 80 毫秒(根据您的代码)才能注意到并写入消息。在此之前 - 进程可能已经退出,您将看不到任何消息。为避免这种情况 - 等待 task1(实际循环)完成:

 var task1 = Task.Run(() => Count(tkn1), tkn1);
var task2 = Task.Run(() => Stop(src1));
task1.Wait();

关于c# - 当取消请求返回 true 时如何做 sthg?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46688203/

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