我有示例代码来比较并行方法和任务方法的处理时间。本实验的目标是了解它们是如何工作的。
所以我的问题是:
公共任务SomeLongOperation() { return Task.Delay(3000);} static void Main(string[] args) { Program p=新程序();列表任务=新列表();tasks.Add(Task.Factory.StartNew(() => p.SomeLongOperation();tasks.Add(Task.Factory.StartNew(() => p.SomeLongOperation();var arr = tasks.ToArray();秒表sw = Stopwatch.StartNew ();Task.WaitAll(arr);Console.WriteLine(“任务等待所有结果:”+ sw.Elapsed);sw.Stop();sw = Stopwatch.StartNew();Parallel.Invoke(() => p.SomeLongOperation(),() => p.SomeLongOperation());Console.WriteLine(“并行调用结果:”+ 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();
我的新结果:
EDIT 2:当我将代码替换为Parallel.Invoke是第一个,Task.WaitAll是第二个时,情况发生了根本的变化。现在并行速度变慢了。这让我想到我估计的不正确之处。我更改了代码,如下所示:
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.我应该在哪里使用任务,在哪里并行?
2.与并行相比,使用任务有什么好处?
3.任务仅仅是ThreadPool.QueueUserWorkItem方法的包装吗?
欢迎任何可以澄清这些问题的有用信息。
https://stackoverflow.com/questions/16101811
复制相似问题