Parallel.Invoke 和调用多个 Task.Run 一样吗?



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返回之前被调用并完成。如果某些行动失败了也没关系。不支持快速失败策略。

两个差异是:

  1. Parallel.Invoke使用当前线程作为工作线程之一。相反,Task.WaitAll+Task.Run只使用ThreadPool线程。当工作线程正在工作时,当前线程被阻塞,不做任何事情。

  2. Parallel.Invoke可配置特定的MaxDegreeOfParallelismTaskSchedulerCancellationToken(ParallelOptions)。这是不可能的Task.Run。使用Task.Factory.StartNew是可能的,但相对而言,它相当麻烦。

相关内容

最新更新