首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重置TaskFactory索引器?

重置TaskFactory索引器?
EN

Stack Overflow用户
提问于 2012-03-14 15:58:52
回答 1查看 357关注 0票数 0

使用

代码语言:javascript
复制
        for (var i = 0; i < 3; i++)
        {
            Task t = Task.Factory.StartNew(Consume);
        }

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

  1. ,当令牌出现时,GarbageCollection不是会自动关闭所有任务吗?我是否必须手动完成或释放它们?
  2. 当任务被令牌正确地杀死时,如何使TaskFactory的索引器休息,从而使3个新任务再次获得它们的ID?

我想使用任务ID来索引特定于任务的数组。当然,这是有解决办法的,但是为什么??一项任务带来了他的。

EN

回答 1

Stack Overflow用户

发布于 2012-03-14 16:43:50

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

但是,要直接回答您的问题:

  1. No.当调用Cancel方法取消令牌源时,它将令牌置于已取消的状态,为该特定令牌源分配的任务将被取消。此时,Task (读取:而不是线程)将被标记为垃圾收集,前提是您没有保存对它的任何引用,就像运行时中可以收集的任何其他对象一样。

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9705450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档