簡體   English   中英

c#中的異步任務

[英]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聲明:

應用程序應發送非常小的調試輸出,並為用戶提供啟用或禁用其使用的方法。 要提供更詳細的跟蹤,請參閱事件跟蹤。

正如伊蘭所說:

如果多個線程同時調用OutputDebugString,它們將被同步

您的第一個示例中沒有並發性,這可能是其更快的原因。

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

從這個改變你的代碼:

//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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM