正在重置TaskFactory索引器

本文关键字:索引 TaskFactory | 更新日期: 2023-09-27 18:27:59

        for (var i = 0; i < 3; i++)
        {
            Task t = Task.Factory.StartNew(Consume);
        }

例如,我正在3个不同的线程上创建3个任务。Tasks在处理数据流之前会获得从1到3的ID。此过程可以通过按下按钮中止,任务将通过取消令牌关闭。这种情况正在发生,我通过调用任务的状态来测试这一点。当我再次开始处理时,将启动任务创建类的一个新实例,并再次创建3个任务。但这一次,他们没有从1到3的ID,而是从4到6的ID。我脑海中浮现出两个问题:

  1. 当代币提升时,GarbageCollection是否会自动杀死所有任务?我必须手动完成或处理它们吗?

  2. 当任务被令牌正确地杀死时,我如何让TaskFactory的索引器休息,这样3个新任务将再次以1获得它们的ID?

我想使用任务ID来索引特定于任务的数组。当然,这有一个变通方法,但为什么——一项任务会带来他的

正在重置TaskFactory索引器

一些事情。有一种常见的误解是,创建Task意味着您正在创建一个新线程。根据您的问题,您似乎是在单个线程上创建任务。这些任务将由使用ThreadPool的默认调度程序(除非您指定了自定义调度程序)排队和出队。如果你熟悉这一点,你就会知道它只会根据需要创建尽可能多的线程,并在必要时重用它们。您可以同时创建10个任务,这些任务只在总共3个线程上执行。

然而,要直接回答您的问题:

  1. 没有。当调用Cancel方法取消令牌源时,它会将令牌置于已取消状态,并且已为特定令牌源分配令牌的任务将被取消。此时,Task(READ:不是线程)将被标记为垃圾收集,如果并且只有当您没有保留它的任何引用时,就像运行时中任何其他可以车库收集的对象一样。

    如果能够成功收集,它将被销毁。然而,后台线程被放回ThreadPool的可用线程列表中。它可能会再次与另一个任务一起使用,或者,如果从未启动另一任务,则ThreadPool最终会释放该Thread并使其GC’d。

  2. 你不能那样做。分配的ID实际上并不是由TaskFactory分配的。当Task启动时,它实际上并没有被分配ID。除非查询Task.Id,否则永远不会被分配ID。ID是从Task类中的静态int创建的,每次请求ID时该静态int都会递增。

    由于您不能创建或修改Task的Id,所以我不会使用它来跟踪它们。相反,在某种集合中自己跟踪它们,或者编写另一个管理它们的类。这不是ID属性的用途,所以不要试图以这种方式使用它。