【发布时间】:2016-10-28 12:59:23
【问题描述】:
我在掌握任务和取消标记时遇到了一些问题。我制作了一个如下所示的程序:
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 个任务(尽管当我不包括 Thread.Sleep() 时,for 循环似乎在任务开始之前运行?)。当我运行程序时,没有任何任务被取消。还有什么困扰着我......当我打电话给token.Cancel() 时,我真正取消了什么任务?我如何选择我要杀死的 5 个任务中的哪一个?我可以通过它的变量定义每个任务,但我无法访问它的CancellationRequested 属性,因为它是由CancellationToken 触发的。那我需要 5 个不同的令牌吗?
【问题讨论】:
标签: c# multithreading asynchronous task cancellationtokensource