我有示例代码来比较并行方法和任务方法的处理时间。这个实验的目的是了解它们是如何工作的。
所以我的问题是:
- 为什么 Parallel 的工作速度比 Task 快?
- 我的结果是否意味着我应该使用 Parallel 而不是 Task?
- 我应该在哪里使用 Task 以及在哪里使用 Parallel?
- 与 Parallel 相比,使用 Task 有什么好处?
Task 是否只是 ThreadPool.QueueUserWorkItem 方法的包装?
public Task SomeLongOperation() { return Task.Delay(3000); } static void Main(string[] args) { Program p = new Program(); List<Task> tasks = new List<Task>(); tasks.Add(Task.Factory.StartNew(() => p.SomeLongOperation())); tasks.Add(Task.Factory.StartNew(() => p.SomeLongOperation())); var arr = tasks.ToArray(); Stopwatch sw = Stopwatch.StartNew(); Task.WaitAll(arr); Console.WriteLine("Task wait all results: " + sw.Elapsed); sw.Stop(); sw = Stopwatch.StartNew(); Parallel.Invoke(() => p.SomeLongOperation(), () => p.SomeLongOperation()); Console.WriteLine("Parallel invoke results: " + sw.Elapsed); sw.Stop(); Console.ReadKey(); }
这是我的处理结果:
编辑:
将代码更改为如下所示:
Program p = new Program();
Task[] tasks = new Task[2];
Stopwatch sw = Stopwatch.StartNew();
tasks[0] = Task.Factory.StartNew(() => p.SomeLongOperation());
tasks[1] = Task.Factory.StartNew(() => p.SomeLongOperation());
Task.WaitAll(tasks);
Console.WriteLine("Task wait all results: " + sw.Elapsed);
sw.Stop();
sw = Stopwatch.StartNew();
Parallel.Invoke(() => p.SomeLongOperation(), () => p.SomeLongOperation());
Console.WriteLine("Parallel invoke results: " + sw.Elapsed);
sw.Stop();
我的新结果:
编辑 2: 当我将代码替换为 Parallel.Invoke 为第一个,Task.WaitAll 为第二个时,情况发生了根本性的变化。现在 Parallel 速度较慢。这让我想到我的估计不正确。我将代码更改为如下所示:
Program p = new Program();
Task[] tasks = new Task[2];
Stopwatch sw = null;
for (int i = 0; i < 10; i++)
{
sw = Stopwatch.StartNew();
Parallel.Invoke(() => p.SomeLongOperation(), () => p.SomeLongOperation());
string res = sw.Elapsed.ToString();
Console.WriteLine("Parallel invoke results: " + res);
sw.Stop();
}
for (int i = 0; i < 10; i++)
{
sw = Stopwatch.StartNew();
tasks[0] = Task.Factory.StartNew(() => p.SomeLongOperation());
tasks[1] = Task.Factory.StartNew(() => p.SomeLongOperation());
Task.WaitAll(tasks);
string res2 = sw.Elapsed.ToString();
Console.WriteLine("Task wait all results: " + res2);
sw.Stop();
}
这是我的新结果:
现在我可以建议这个实验更加清晰。结果几乎相同。有时并行,有时任务更快。现在我的问题是:
1.我应该在哪里使用Task,在哪里使用Parallel?
2. 与 Parallel 相比,使用 Task 有什么好处?
3. Task 是否只是 ThreadPool.QueueUserWorkItem 方法的包装?
欢迎任何可以澄清这些问题的有用信息。