如何获取第三方物流任务的参考';C#中的s螺纹?

如何获取第三方物流任务的参考';C#中的s螺纹?,c#,.net,multithreading,concurrency,task-parallel-library,C#,.net,Multithreading,Concurrency,Task Parallel Library,当我将任务创建为 Task task = Task.Factory.StartNew(() => someMethod(args)); 在C#4.0+中,如何获取此任务线程的引用 任务是否可能在创建任务的同一线程中执行,或者生成多个线程 更新: 原因是: 我想在调试器中标识任务的线程(并为其指定一个名称),等等 创建的任务是否总是在与创建任务的线程不同的线程中执行? 是一个线程、零个线程还是多个线程? 它是在同一个内核上执行的吗? 知道这一点很重要,因为,例如,我可以将主线程置于睡眠

当我将任务创建为

Task task = Task.Factory.StartNew(() => someMethod(args));
在C#4.0+中,如何获取此任务线程的引用

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

更新:
原因是:

  • 我想在调试器中标识任务的线程(并为其指定一个名称),等等
创建的任务是否总是在与创建任务的线程不同的线程中执行?
是一个线程、零个线程还是多个线程?
它是在同一个内核上执行的吗?
知道这一点很重要,因为,例如,我可以将主线程置于睡眠状态,认为我正在冻结后台工作人员

更新:
有用的答案:

您可以使用:

System.Threading.Thread.CurrentThread
但是正如在评论中所说的,您使用TPL来抽象线程,因此回到这个“低级别”很可能是糟糕设计的一个指标

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

不,在某些情况下,TPL能够确定任务可以在创建它的同一线程上执行,这可能是因为提供了相关的任务创建选项(或任务调度器),也可能是因为调用线程没有任何事情要做,所以是一种优化。不过,你真的不必为此担心;并不是因为TPL选择在该上下文中执行它的代码,所以最终会阻塞UI线程。除非你明确表示应该这样做,否则这不会发生。无论出于何种意图和目的,你都可以假设这永远不会发生(除非你强迫它发生),但在幕后,你永远不需要意识到它,是的,它是可以发生的

它是一个线程、零个线程还是多个线程

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

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

有可能,但不一定

知道这一点很重要,因为,例如,我可以将主线程置于睡眠状态,认为我正在冻结后台工作人员

将主线程置于睡眠状态不会阻止后台工作人员工作。这就是创建后台工作人员的全部意义,这两个任务不会阻止彼此进行工作。请注意,如果后台工作人员试图访问UI以报告进度或显示结果,并且UI被阻止,则他们将在此时等待UI线程空闲。

Task.Factory.StartNew()将任务排队等待执行(请参阅)。执行任务的实际线程及其执行时间取决于指定的TaskScheduler(如果未指定,则使用当前TaskScheduler)

在.Net 4中,默认的TaskScheduler使用线程池来执行任务(请参阅),因此,如果线程池线程将任务排入队列,则同一线程稍后可能会执行该任务

线程数量由线程池决定

你不应该真正关心你的任务是在哪个核心上执行的


将任务排队等待执行很可能会将其安排在线程池线程上执行,这样您就不会有意外地将主线程置于睡眠状态的风险

您永远不需要这样做。你想解决什么问题?据我所知,你做不到。不能保证任务会产生一个新线程,它可以在创建它的同一个线程上运行。此外,任务(可能)可以在多个线程之间拆分。但我是@SLaks的,一般来说,这种方法有点不对劲。答案是:(1)当然,但为什么,(2)是的,(3)是的。你考虑这样做的原因是什么?你的目标是什么?从外部的角度来看,线程的数量和重用是不可预测的。更多的线程并不一定意味着工作速度更快。。例如,如果您只有一个单核cpu,并且您唯一要做的就是计算,那么每个额外的线程都将是资源的浪费。此外,生成线程还需要花费时间和ram,有时这比使用多个CPU的好处要多。如果您为该线程指定了一个名称,则该名称将在任务期间保持不变。其他任务可能共享相同的线程名称,这会造成混淆。我希望有一种命名任务的方法。如果未指定任何任务计划程序,则使用默认任务计划程序(使用线程池的任务计划程序),而不是当前任务计划程序。根据MSDN文档,不是这样。它说调用Factory.StartNew()相当于创建一个任务并调用Task.Start(),后者使用当前。请参阅我的帖子+1中的链接,这是OP关于在调试器中查找任务的另一个问题,我将向他们指出(调试器的MSDN说明)和。