【发布时间】:2014-10-04 10:54:50
【问题描述】:
我创建的一个小程序,用于了解 Async Await 的工作并在 for 循环中调用 async 方法,作为直接方法调用:
sumProgram.CallSum(i, i + 1);
或使用任务 API Task.Run / Task.Factory.StartNew
我最初的理解是 Task API 会大大提高速度,但与我的预期相反,这肯定反映了我的理解不足,直接调用在性能方面要好得多。事实上,当在 GetSum 方法中引入额外的 Thread sleep 时,它似乎只影响 Task 调用,而且影响很大。
现在我了解直接调用的第一部分更快,因为它们是异步执行的,并且没有添加到任务列表并使它们等待的开销,但是当我将相同的技术转移到真正的编程范式时,那么问题仍然存在:
对于直接调用,没有什么可以模拟Task.WaitAll,所以他们会退出调用方法,即使所有的执行都没有完成,所以我唯一的选择是Task wrapper。
我是否得到了令人费解的结果,因为对于直接调用,秒表甚至会在所有执行完成之前发布时间,而由于 waitAll,任务包装器不会出现这种情况
-
为了执行这个程序,您需要注释/取消注释相关部分以获得正确的结果
class Program { static void Main(string[] args) { Program sumProgram = new Program(); List<Task> taskList = new List<Task>(); // Only For Task Stopwatch sw = Stopwatch.StartNew(); for (int i = 0; i < 100000; i++) { taskList.Add(Task.Factory.StartNew(() => { sumProgram.CallSum(i, i + 1); })); // For Task use one taskList.Add(Task.Run(() => { sumProgram.CallSum(i, i + 1); })); // For Task use one sumProgram.CallSum(i, i + 1); } Task.WaitAll(taskList.ToArray()); // Only For Task sw.Stop(); Console.WriteLine("Time Elapsed :: " + sw.ElapsedMilliseconds); } public async Task CallSum(int num1, int num2) { Func<int> callFunc = (() => { return GetSum(num1, num2); }); int result = await Task.Run<int>(callFunc); //Console.WriteLine("Sum Result :: " + result); } public int GetSum(int num1, int num2) { Thread.Sleep(10); return (num1 + num2); } }
【问题讨论】:
-
任务创建和处理的开销很大。这些任务确实太少了,不重要。
-
你的问题是什么?
-
问题在要点中需要重申 - 在实际编程场景中,似乎没有办法等待异步执行直接调用,所以等待所有的任务似乎是在所有异步之前保持方法的唯一方法处决返回,我还有其他选择吗
-
@Erno de Weerd 我理解你的观点,但是在真正的编程范式中,每个任务都会做一个密集的操作,我的例子是相当简化的表示
标签: c# .net asynchronous task-parallel-library task