Task.Run
:将指定的工作排在ThreadPool
上运行,并返回该工作的任务句柄或Task<TResult>
句柄。
Parallel.Invoke
:执行每个提供的操作,可能是并行的。
它们有效地从线程池中启动一个新线程。那么,Parallel.Invoke
是否与调用多个Task.Run
相同?
所以你想比较这两种技术:
Parallel.Invoke(source.Select(source => () => ProcessItem(source)).ToArray());
Task.WaitAll(source.Select(source => Task.Run(() => ProcessItem(source))).ToArray());
有一个相似点和两个不同点。两者的相似之处在于所有的动作都将在Parallel.Invoke
/Task.WaitAll
返回之前被调用并完成。如果某些行动失败了也没关系。不支持快速失败策略。
两个差异是:
Parallel.Invoke
使用当前线程作为工作线程之一。相反,Task.WaitAll
+Task.Run
只使用ThreadPool
线程。当工作线程正在工作时,当前线程被阻塞,不做任何事情。Parallel.Invoke
可配置特定的MaxDegreeOfParallelism
、TaskScheduler
和CancellationToken
(ParallelOptions
)。这是不可能的Task.Run
。使用Task.Factory.StartNew
是可能的,但相对而言,它相当麻烦。