我在打印Task.CompletedTask.Id 时候 发现 当我没有创建任何Task的时候 可以打印出来一个已经完成的taskID = 1,此时我以为1是默认值 直到
using(CancellationTokenSource source = new CancellationTokenSource()) {
Task task1 = Task.Factory.StartNew((obj) => {
Console.WriteLine("开始执行task1任务:" + obj + " ID :" + Task.CurrentId);
}, (object)"zzz", source.Token);
Console.WriteLine("task1ID: " + task1.Id);
Console.WriteLine("finishTaskID: " + Task.CompletedTask.Id);
}
我尝试等task1完成后再次打印
using(CancellationTokenSource source = new CancellationTokenSource()) {
Task task1 = Task.Factory.StartNew((obj) => {
Console.WriteLine("开始执行task1任务:" + obj + " ID :" + Task.CurrentId);
}, (object)"zzz", source.Token);
Console.WriteLine("task1ID: " + task1.Id);
Thread.Sleep(1000);
Console.WriteLine("task1 State: " + task1.Status);
Console.WriteLine("finishTaskID: " + Task.CompletedTask.Id);
}
我想直到Task.CompletedTask获取的既然不是我已经完成的任务那它到底是什么?
就是一个独立的任务以区别于任何其他的任务,所以你取的时候都是不会和你创建的任务id相同。
Task内部默认实现使用线程池,这个没问题把
理解这个,你就能理解这个Task.CompletedTask了,他是从池挑选一个状态为Completed的线程给你。
因为你的程序需要知道的是线程已经执行完成,并不是需要“那个线程本人亲自告诉你”
注解
此属性返回其 Status 属性设置为 RanToCompletion的任务。 若要创建返回值并运行到完成的任务,请调用 FromResult 该方法。
反复尝试检索此属性值可能不会始终返回相同的实例。