如何获得TPL任务的线程在C#中的参考?(How to get the reference of T

2019-07-21 08:35发布

当我创建了一个任务,

Task task = Task.Factory.StartNew(() => someMethod(args));

在C#4.0 +,我怎么能得到这个任务的线程(S)的参考?

是否有可能的是,任务是在创建任务相同的线程执行或产卵以上的线程吗?

更新:
其理由是:

  • 我想,以确定任务的线程调试器(和它的属性的名称),等等。

创建从其中一个任务是创建一个单独的线程总是执行任务吗?
它是一个,零个或多个线程?
它是不是在一个单一的和相同的核心执行?
据了解,因为,例如,我可以把睡在主线程的思想,我冻结后台工作是非常重要的

更新:
有用的答案:

  • 使用Task.StartNew时指定一个线程的名字

Answer 1:

创建从其中一个任务是创建一个单独的线程总是执行任务吗?

不,有某些情况下在其中TPL能够确定该任务可以创建它的同一线程上执行,或者是因为相关的任务创建选项(或任务调度器)供给,或因为调用的优化螺纹否则不会有任何瓜葛。 你并不真的需要担心这虽然; 它不喜欢你将最终阻塞UI线程,因为TPL选择执行它在这方面的代码。 这不会发生,除非你明确指出它应该。 对于所有意图和目的,你可以认为这永远不会发生(除非你强迫它发生),但在幕后,没有你永远需要实现它,是的,它可能发生。

它是一个,零个或多个线程?

默认情况下,任务线程池中执行。 线程池将它包含基于它给了工作量的线程数会有所不同。 它将从1开始,但是成长,如果有足够的需求,如果需求萎缩消失。 如果指定LongRunning选项,一个新的线程将只为创建Task 。 如果你指定一个自定义TaskScheduler ,你可以把它做任何你想要它。

它是不是在一个单一的和相同的核心执行?

潜在的,但不能确定地。

据了解,因为,例如,我可以把睡在主线程的思想,我冻结后台工作是非常重要的

把主线程睡眠不会阻止背景工人的工作。 这是创建的背景工人的整 ,这两个任务不从做工作,阻止对方。 请注意,如果后台工作人员曾尝试访问UI无论是报告进展情况或显示效果,并且UI被阻塞,那么他们将等待UI线程是自由的在这一点上。



Answer 2:

您可以使用:

System.Threading.Thread.CurrentThread

但正如在评论中说,使用TPL抽象线程了,所以要回本“低水平”是设计不良可能的指标。



Answer 3:

Task.Factory.StartNew()队列执行的任务(见这里 )。 (当前的TaskScheduler使用,如果没有指定)执行任务,当它被执行达指定的TaskScheduler的实际线程。

在.NET 4中默认的TaskScheduler使用线程池来执行任务(见这里 ),所以如果一个线程池线程排队的同一个线程可以执行可能在以后的任务。

线程数是由线程池决定。

你不应该真正关心它的核心任务的执行上。

正在排队等待执行的任务将最有可能安排它要在一个线程池线程执行的,所以你不会在意外把主线程睡眠风险



文章来源: How to get the reference of TPL task's thread in C#?