这可能是一个简单而愚蠢的问题。我创建了这样一个任务:
Task<bool> myTask = new Task<bool>(() => { Debug.WriteLine("Task fired"); return true; });
// I know I can create it with Task.Run, but this is for purpose of the sample
myTask.Start();
我对此有几个疑问:
我已经阅读了一些文档,但我没有找到具体的解释。例如,Task documentation通常表示任务:
因为Task对象执行的工作通常在线程池线程上异步执行,而不是在主应用程序线程上同步执行...
答案 0 :(得分:11)
它总是在ThreadPool线程上运行吗?
不一定。如果您查看Task
constructor overload taking a TaskCreationOptions
,则可以传递值TaskCreationOptions.LongRunning
。如果在内部它使用TaskScheduler.Default
,这将创建一个新线程,而不是线程池之一。
通常,建议您使用Task.Run
对线程池上的线程进行排队。如果您想传递自定义TaskScheduler
,可以使用更高级的Task.Factory.StartNew
,但我建议您在真正需要时使用它。
如果它在ThreadPool上运行,它有可能由UI运行 线?如果有工作 - 可以阻止吗?
没有。 UI线程不是ThreadPool使用的池的一部分。
在大量任务的情况下,很少可以分配给一个线程 (排队)然后一个接一个地跑?或者每项任务都有自己的任务 线程?
这是特定于正在使用的TaskScheduler
的实现。如果我们查看ThreadPoolTaskScheduler
(在没有传递自定义的情况下是默认值),则线程池以一定量的线程开始,并根据需要进行扩展。不保证每个代理将在不同的线程上执行。但是,您可以创建自定义TaskScheduler
,您可以在其中控制为exectuion安排任务的机制。
答案 1 :(得分:1)
回答第一点:“从.NET Framework 4开始,使用线程池的最简单方法是使用任务并行库(TPL)。默认情况下 [强调添加] ,像Task和Task这样的并行库类型使用线程池线程来运行任务。“
https://msdn.microsoft.com/en-us/library/0ka9477y(v=vs.110).aspx