一個小程序,我創建了理解異步等待的工作,並呼籲在for循環中的異步方法,作爲一個直接的方法調用:異步等待 - 直接的方法調用VS任務包裝呼叫
sumProgram.CallSum(i, i + 1);
或使用任務API Task.Run/Task.Factory.StartNew
我最初的理解是任務API會使它快得多,但與我的預期相反,這肯定反映了我的理解不足,直接調用在性能方面要好得多。實際上,當在GetSum方法中引入額外的線程休眠時,它似乎隻影響任務調用,並且也會大幅度影響。
現在我明白了直接調用的第一部分速度更快,因爲它們是異步執行的,沒有任何額外的任務和讓它們等待的開銷,但是當我將相同的技術轉移到真正的編程時範式,那麼問題是:
對於直接呼叫,沒有什麼模仿Task.WaitAll,所以他們會退出調用的方法,即使所有的執行是不完整的,所以是我唯一的選擇任務的包裝。
我會得到令人費解的結果,因爲在直接調用秒錶將發佈之前就全部執行完成時間,並且不會對任務包裝的情況下,由於爲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); } }
任務創建和處理有大量開銷。這些任務做得太少而不重要。 – 2014-10-04 11:04:34
實際上你的問題是什麼? – i3arnon 2014-10-04 11:12:25
有些問題需要重申 - 在真正的編程場景中,似乎沒有辦法等待直接調用的異步執行,所以帶有等待的任務似乎只能在所有異步執行返回之前保持該方法,還有其他選項對我來說 – 2014-10-04 11:36:26