如何在C#中获取TPL任务的线程参考?

Ful*_*oof 5 .net c# concurrency multithreading task-parallel-library

当我创建一个任务时

Task task = Task.Factory.StartNew(() => someMethod(args));
Run Code Online (Sandbox Code Playgroud)

在C#4.0+中,我如何获得此任务的线程的引用?

是否可能在创建任务的同一线程中执行任务或生成多个线程?

更新:
原因是:

  • 我想在调试器中识别任务的线程(并为其命名属性)等.

创建的任务是否始终在与创建任务的线程不同的线程中执行?
它是一个,零个还是多个线程?
它是在同一个核心上执行的吗?
重要的是要知道,因为,例如,我可以睡觉主线程,认为我冻结后台工作人员

更新:
有用的答案:

Ser*_*rvy 7

创建的任务是否始终在与创建任务的线程不同的线程中执行?

不,在某些情况下,TPL能够确定任务可以在创建它的同一个线程上执行,因为提供了相关的任务创建选项(或任务调度程序),或者因为调用而作为优化否则线程将无法做任何事情.你不需要担心这个问题; 它不会像你最终阻止UI线程,因为TPL选择在该上下文中执行它的代码.除非您明确指出应该这样做,否则不会发生这种情况.对于所有意图和目的,你可以假设这种情况永远不会发生(除非你强迫它发生),但在幕后,你不需要意识到它,是的,它可能会发生.

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

默认情况下,任务在线程池中执行.根据给定的工作负载,线程池的线程数会有所不同.它将从一开始,但如果有足够的需求则增长,如果需要消失则缩小.如果指定该LongRunning选项,则将为此创建一个新线程Task.如果您指定了自定义TaskScheduler,则可以让它执行您想要的任何操作.

它是在同一个核心上执行的吗?

可能,但不能确定.

重要的是要知道,因为,例如,我可以睡觉主线程,认为我冻结后台工作人员

将主线程置于休眠状态不会阻止后台工作程序工作.这是整创建背景的工人,这两个任务不从做工作,阻止对方.请注意,如果后台工作人员尝试访问UI以报告进度或显示结果,并且UI被阻止,那么他们将等待UI线程在此时空闲.