2016-08-03 110 views
1

我有兩個任務Job1和Job2及以下是代碼。我第一次按順序運行Job1和Job2,得到秒錶輸出爲844毫秒。第二次,我評論了順序作業並稱爲並行任務處理,並將秒錶結果取爲11352毫秒。我的假設/期望是我應該得到的輸出爲422(因爲844/2)或某個接近它的地方。但結果完全相反。我需要等待兩項工作完成,因此我把t1.Wait()和t2.Wait();請幫助我在半個連續處理中處理這兩個作業。請在下面找到我的代碼:c中的異步任務#

public ActionResult Index() 
    { 
     Stopwatch s = new Stopwatch(); 
     s.Start(); 

     //Execute 2 jobs in a sequence 
     Job1(); 
     Job2(); 

     //Execute 2 jobs in parallel 
     //var t1 = Task.Run(() => { Job1(); }); 
     //var t2 = Task.Run(() => { Job2(); }); 
     //t1.Wait(); 
     //t2.Wait(); 

     s.Stop(); 
     Debug.WriteLine("ElapsedMilliseconds: " + s.ElapsedMilliseconds); 
     return View(); 
    } 

    private void Job1() 
    { 
     for (int i = 0; i < 1000; i++) 
     { 
      Debug.WriteLine(i); 
     } 
    } 

    private void Job2() 
    { 
     for (int i = 2000; i < 3000; i++) 
     { 
      Debug.WriteLine(i); 
     } 
    } 
+1

開始任務可能非常耗時。你必須考慮這個開銷。如果引入並行性,您可能永遠無法讓您的兩項任務更快。 – Enigmativity

+0

Debug.WriteLine可能具有鎖定/同步代碼,導致很多的阻止和啓動可能? http://stackoverflow.com/questions/2759301/debug-writeline-locks這表明它。嘗試使用Thread.Sleep的過程或者更簡單的測試時間。 –

+0

放一個線程。在Job1和Job2中睡眠約1000毫秒,你會發現你實際上是在調用這兩種方法,但總是會有引入併發症的開銷,並且由於這種操作與你正在做的操作類型一起可能無法獲得預期結果。 – Daniel

回答

2

本質上你的第二個例子是較慢由於Debug.WriteLine併發期間的開銷。

如果您刪除Debug.WriteLine(它在引擎蓋下調用OutputDebugString),您會注意到很大的差異。

MSDN指出:

應用程序應該發出很小的調試輸出,併爲用戶提供可啓用或禁用它的使用方式。要提供更詳細的跟蹤,請參閱事件跟蹤。

至於葉蘭指出這裏:

if several threads call OutputDebugString concurrently, they will be synchronized

你的第一個例子沒有併發性,所以這可能是其更快的原因。

您也可以考慮轉向一次等待。

從此改變你的代碼:

//Execute 2 jobs in parallel 
var t1 = Task.Run(() => { Job1(); }); 
var t2 = Task.Run(() => { Job2(); }); 
t1.Wait(); 
t2.Wait(); 

...這樣的:

//Execute 2 jobs in parallel 
var tasks = new List<Task>(); 
tasks.Add(Task.Run(() => { Job1(); })); 
tasks.Add(Task.Run(() => { Job2(); })); 
Task.WaitAll(tasks.ToArray());