关于 Task.CompletedTask 的疑问

问题遇到的现象和发生背景

我在打印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);
        }

运行结果及报错内容

img

我的解答思路和尝试过的方法

我尝试等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);
        }

img


我发现通过 Task.CompletedTask获取的task仍然不是task1

我想要达到的结果

我想直到Task.CompletedTask获取的既然不是我已经完成的任务那它到底是什么?

就是一个独立的任务以区别于任何其他的任务,所以你取的时候都是不会和你创建的任务id相同。

Task内部默认实现使用线程池,这个没问题把

理解这个,你就能理解这个Task.CompletedTask了,他是从池挑选一个状态为Completed的线程给你。

因为你的程序需要知道的是线程已经执行完成,并不是需要“那个线程本人亲自告诉你”

注解
此属性返回其 Status 属性设置为 RanToCompletion的任务。 若要创建返回值并运行到完成的任务,请调用 FromResult 该方法。

反复尝试检索此属性值可能不会始终返回相同的实例。