[英]Async Task in c#
我有兩個任務Job1和Job2,下面是代碼。 我第一次按順序運行Job1和Job2,並將秒表輸出設為844毫秒。 第二次我評論順序作業並調用並行任務處理並將秒表結果作為11352毫秒。 我的假設/期望是我應該得到輸出為422(因為844/2)或接近它的某個地方。 但結果完全相反。 我需要等待兩個作業完成,因此我把t1.Wait()和t2.Wait(); 請幫助我在一半的順序處理中處理這兩個作業。 請在下面找到我的代碼:
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);
}
}
基本上你的第二個例子是由於在並發期間Debug.WriteLine
的開銷而變慢。
如果刪除Debug.WriteLine
(在引擎蓋下調用OutputDebugString
),您會注意到一個很大的區別。
MSDN聲明:
應用程序應發送非常小的調試輸出,並為用戶提供啟用或禁用其使用的方法。 要提供更詳細的跟蹤,請參閱事件跟蹤。
正如伊蘭所說:
您的第一個示例中沒有並發性,這可能是其更快的原因。
您也可以考慮轉向單一等待。
從這個改變你的代碼:
//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());
要理解為什么任務與性能無關,但更多的是響應性,你應該閱讀
上下文切換: https : //en.wikipedia.org/wiki/Context_switch
處理器使用大量周期切換到另一個線程
互斥體 : https : //en.wikipedia.org/wiki/Mutual_exclusion
每次調用Debug.WriteLine時,Task都會等待,直到另一個Task中的Debug.WriteLine完成並執行上下文切換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.