<em id="3iliw"></em>
  • <progress id="3iliw"></progress>
  • <tbody id="3iliw"><pre id="3iliw"></pre></tbody><dd id="3iliw"><noscript id="3iliw"></noscript></dd>

    <progress id="3iliw"></progress>

    杭州.net培訓
    達內杭州.net培訓中心

    13175137725

    NETCore你知道多少

    • 時間:2019-01-17 18:02
    • 發布:轉載
    • 來源:網絡


    如果你需要運行多個后臺任務,這里有些方法可以幫助到你。 要同時運行多個任務,只需連續啟動它們并收集它們的引用,例如在數組中:


    var backgroundTasks = new []


    {


    Task.Run(() => DoComplexCalculation(1)),


    Task.Run(() => DoComplexCalculation(2)),


    Task.Run(() => DoComplexCalculation(3))


    };


    現在你可以使用Task類的靜態方法,等待他們被異步或者同步執行完畢。


    // wait synchronously


    Task.WaitAny(backgroundTasks);


    Task.WaitAll(backgroundTasks);


    // wait asynchronously


    await Task.WhenAny(backgroundTasks);


    await Task.WhenAll(backgroundTasks);


    實際上,這兩個方法最終都會返回所有任務的自身,可以像任何其他任務一樣再次操作。為了獲取對應任務的結果,你可以檢查該任務的Result屬性。 處理多任務的異常有點棘手。方法WaitAllWhenAll不管哪個任務被收集到異常時都會拋出異常。


    不過,對于WaitAll,將會收集所有的異常到對應的InnerExceptions屬性;對于WhenAll,只會拋出第一個異常。為了確認哪個任務拋出了哪個異常,您需要單獨檢查每個任務的StatusException屬性。 在使用WaitAnyWhenAny時必須足夠小心。


    他們會等到第一個任務完成(成功或失敗),即使某個任務出現異常時也不會拋出任何異常。他們只會返回已完成任務的索引或者分別返回已完成的任務。


    你必須等到任務完成或訪問其result屬性時捕獲異常,例如:


    var completedTask = await Task.WhenAny(backgroundTasks);


    try


    {


    var result = await completedTask;


    }


    catch (Exception e)


    {


    // handle exception


    }


    如果你想連續運行多個任務,代替并發任務,可以使用延續(continuations)的方式:


    var compositeTask = Task.Run(() => DoComplexCalculation(42))


    .ContinueWith(previous => DoAnotherComplexCalculation(previous.Result),


    TaskContinuationOptions.OnlyOnRanToCompletion)


    ContinueWith()方法允許你把多個任務一個接著一個執行。這個延續的任務將獲取到前面任務的結果或狀態的引用。 你仍然可以增加條件判斷是否執行延續任務,例如只有在前面任務成功執行或者拋出異常時。


    對比連續等待多個任務,提高了靈活性。 當然,您可以將延續任務與之前討論的所有功能相結合:異常處理、取消和并行運行任務。這就有了很大的表演空間,以不同的方式進行組合:


    var multipleTasks = new[]


    {


    Task.Run(() => DoComplexCalculation(1)),


    Task.Run(() => DoComplexCalculation(2)),


    Task.Run(() => DoComplexCalculation(3))


    };


    var combinedTask = Task.WhenAll(multipleTasks);


    var successfulContinuation = combinedTask.ContinueWith(task =>


    CombineResults(task.Result), TaskContinuationOptions.OnlyOnRanToCompletion);


    var failedContinuation = combinedTask.ContinueWith(task =>


    HandleError(task.Exception), TaskContinuationOptions.NotOnRanToCompletion);


    await Task.WhenAny(successfulContinuation, failedContinuation);


    任務同步


    如果任務是完全獨立的,那么我們剛才看到的協調方法就已足夠。然而,一旦需要同時共享數據,為了防止數據損壞,就必須要有額外的同步。 


    兩個以及更多的線程同時更新一個數據結構時,數據很快就會變得不一致。就好像下面這個示例代碼一樣:


    var counters = new Dictionary< int, int >();


    if (counters.ContainsKey(key))


    {


    counters[key] ++;


    }


    else


    {


    counters[key] = 1;


    }


    當多個線程同時執行上述代碼時,不同線程中的特定順序執行指令可能導致數據不正確,例如:


    ·        所有線程將會檢查集合中是否存在同一個key


    ·        結果,他們都會進入else分支,并將這個key的值設為1


    ·        最后結果將會是1,而不是2。如果是接連著執行代碼的話,將會是預期的結果。


    上述代碼中,臨界區(critical section)一次只允許一個線程可以進入。在C#中,可以使用lock語句來實現:


    var counters = new Dictionary< int, int >();


    lock (syncObject)


    {


    if (counters.ContainsKey(key))


    {


    counters[key]++;


    }


    else


    {


    counters[key] = 1;


    }


    }


    在這個方法中,所有線程都必須共享相同的的syncObject


    作為最佳做法,syncObject應該是一個專用的Object實例,專門用于保護對一個獨立的臨界區的訪問,避免從外部訪問。 lock語句中,只允許一個線程訪問里面的代碼塊。


    它將阻止下一個嘗試訪問它的線程,直到前一個線程退出。這將確保線程完整執行臨界區代碼,而不會被另一個線程中斷。


    當然,這將減少并行性并減慢代碼的整體執行速度,因此您最好最小化臨界區的數量并使其盡可能的短。


    使用Monitor類來簡化lock聲明:


    var lockWasTaken = false;


    var temp = syncObject;


    try


    {


    Monitor.Enter(temp, ref lockWasTaken);


    // lock statement body


    }


    finally


    {


    if (lockWasTaken)


    {


    Monitor.Exit(temp);


    }


    }


    盡管大部分時間您都希望使用lock語句,但Monitor類可以在需要時給予額外的控制。例如,您可以使用TryEnter()而不是Enter(),并指定一個限定時間,避免無止境地等待鎖釋放。


    預約申請免費試聽課

    怕錢不夠?就業掙錢后再付學費!    怕學不會?從入學起,達內定制課程!     擔心就業?達內多家實踐企業供你挑選!

    上一篇:劃重點了!
    下一篇:JAVA常見的算法集錦
    • 掃碼領取資料

      回復關鍵字:視頻資料

      免費領取 達內課程視頻學習資料

    • 視頻學習QQ群

      添加QQ群:1143617948

      免費領取達內課程視頻學習資料

    Copyright ? 2018 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

    選擇城市和中心
    江西省

    貴州省

    廣西省

    海南省

    国拍自产亚洲 2019国拍自产在线,国拍自产亚洲,国产a在线不卡 百度 好搜 搜狗
    <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>