我在处理任务和取消令牌时遇到了一些问题。我做了一个程序,它看起来像这样:(?虽然我不包括Thread.Sleep()
的for
循环似乎运行之前,任务甚至开始)c#异步任务取消
static void Main(string[] args)
{
CancellationTokenSource token = new CancellationTokenSource();
Stopwatch stop = new Stopwatch();
stop.Start();
for (int i = 0; i < 5; i++)
{
//Thread.Sleep(1000);
Task.Factory.StartNew(() => myLongTask(token.Token, (i + 1) * 1000));
}
while (true)
{
Thread.SpinWait(1000);
if (stop.ElapsedMilliseconds > 3000)
{
token.Cancel();
}
}
}
public static void myLongTask(CancellationToken token, int time)
{
if (token.IsCancellationRequested)
{
Console.WriteLine("Cancelled");
return;
}
var sw = Stopwatch.StartNew();
Console.WriteLine($"Task {time/1000} started");
while (sw.ElapsedMilliseconds < time)
Thread.SpinWait(1000);
Console.WriteLine($"Task {time/1000} ended");
}
我同时运行5个任务。当我运行程序时,任何任务都不会取消。另外什么是窃听我是...什么任务我真的取消时调用token.Cancel()
?我怎样才能选择我要杀的5个任务中的哪一个?我可以通过它的变量来定义每个任务,但我不能访问它的属性,因为它是由CancellationToken
触发的。我需要5个不同的标记吗?
但是,如果我有5个不同的任务,只有一个'token.Cancel()'...那么它显然取消所有5个?如果我想杀死一个特定的任务,我是否需要一个令牌列表? – Norgul
@Norgul:是的,你会的。或者至少,你需要5个不同的标记和*某种方式来知道你想要停止的任务正在观察哪一个。 –