这个班级CancellationTokenSource是一次性的.快速浏览Reflector证明KernelEvent了(很可能)非托管资源的使用.由于CancellationTokenSource没有终结器,如果我们不处理它,GC将不会这样做.
另一方面,如果您查看MSDN文章" 托管线程中的取消"中列出的示例,则只有一个代码段处置该令牌.
在代码中处理它的正确方法是什么?
using如果您不等待它,则无法将启动并行任务的代码包装起来.只有在你不等的时候取消才有意义.ContinueWith通过Dispose电话添加任务,但这是要走的路吗?.ForAll(x => Console.Write(x))?因为它没有类似于Reset清理IsCancelRequested和Token字段的方法,所以我认为它不可重复使用,因此每次启动任务(或PLINQ查询)时都应该创建一个新任务.这是真的吗?如果是,我的问题是Dispose在这些CancellationTokenSource案例中处理的正确和建议的策略是什么?
什么是使用CancellationToken的IsCancellationRequested财产?考虑下面的代码
static void Main(string[] args)
{
CancellationTokenSource tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
Console.WriteLine("Press Enter to Start.\nAgain Press enter to finish.");
Console.ReadLine();
Task t = new Task(() =>
{
int i = 0;
while (true)
{
if (token.IsCancellationRequested)
{
Console.WriteLine("Task Cancel requested");
break;
}
Console.WriteLine(i++);
}
}, token);
t.Start();
// wait for input before exiting
Console.ReadLine();
tokenSource.Cancel();
if(t.Status==TaskStatus.Canceled)
Console.WriteLine("Task was cancelled");
else
Console.WriteLine("Task completed");
}
Run Code Online (Sandbox Code Playgroud)
我发现在极少数情况下if块内的代码不运行。如果是这样,轮询查看是否请求取消有什么用?