使用
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的问题出现在我的脑海中:
我想使用任务ID来索引特定于任务的数组。当然,这是有解决办法的,但是为什么??一项任务带来了他的。
发布于 2012-03-14 16:43:50
几件事。有一种常见的误解,即创建一个Task意味着要创建一个新线程。根据您的问题,您似乎是在单线程上创建任务。这些任务将由使用ThreadPool的默认调度程序(除非您指定了自定义调度器)排队和退出。如果您熟悉这一点,您就会知道,它只会创建尽可能多的线程,并将在必要时重用它们。您可以同时创建10个任务,只在3个线程上执行。
但是,要直接回答您的问题:
Cancel方法取消令牌源时,它将令牌置于已取消的状态,为该特定令牌源分配的任务将被取消。此时,Task (读取:而不是线程)将被标记为垃圾收集,前提是您没有保存对它的任何引用,就像运行时中可以收集的任何其他对象一样。如果它能被成功收集,它就会被销毁。然而,支持线程被放回ThreadPool的可用线程列表中。它可能再次与另一个任务一起使用,或者,如果另一个任务从未启动,ThreadPool最终将释放该Thread并使其成为GC‘s,
TaskFactory分配的。当Task启动时,它实际上没有被分配一个ID,除非您查询Task.Id,否则它永远不会被分配一个ID。ID是从Task类中的静态int创建的,每次请求ID时都会递增。因为您不能创建或修改任务的Id,所以我不会使用它来跟踪它们。相反,自己在一个集合中跟踪它们,或者编写另一个管理它们的类。这不是创建ID属性的目的,所以不要试图以这种方式使用它。
https://stackoverflow.com/questions/9705450
复制相似问题