亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

任務與線程差異

任務與線程差異

江戶川亂折騰 2019-07-19 10:30:10
任務與線程差異我對并行編程很陌生。在.NET中有兩個類可用:Task和Thread.所以,我的問題是:這些類之間有什么區別?什么時候使用更好?Thread什么時候Task?
查看完整描述

3 回答

?
叮當貓咪

TA貢獻1776條經驗 獲得超12個贊

通常你聽到任務是一個比線程更高級的概念。..這就是這句話的意思:

  1. 不能使用ABORT/ThreadAbortedException,您應該在定期測試“業務代碼”中支持取消事件token.IsCancellationRequested標志(也避免長連接或無時間連接,例如到db,否則您將永遠沒有機會測試此標志)。出于類似的原因Thread.Sleep(delay)調用應替換為Task.Delay(delay, token)打電話。

  2. 沒有線SuspendResume方法具有任務的功能。不能重用任務實例也一樣。

  3. 但是你得到了兩個新工具:

    a)延續

    // continuation with ContinueWhenAll - execute the delegate, when ALL// tasks[] had been finished; other option is ContinueWhenAnyTask.Factory.ContinueWhenAll( 
       tasks,
       () => {
           int answer = tasks[0].Result + tasks[1].Result;
           Console.WriteLine("The answer is {0}", answer);
       });

    b)嵌套/子任務

    //StartNew - starts task immediately, parent ends whith childvar parent = Task.Factory.StartNew(() => {
              var child = Task.Factory.StartNew(() =>
             {
             //...
             });
          },  
          TaskCreationOptions.AttachedToParent);
  4. 因此,系統線程對任務是完全隱藏的,但在具體的系統線程中仍然執行任務的代碼。系統線程是用于任務的資源。當然,在任務并行執行的遮罩下仍然存在線程池。線程如何執行新任務可能有不同的策略。另一個共享資源任務調度器關心它。一些問題任務調度器解決1)喜歡在同一個線程中執行任務及其計算,以最小化切換成本。內聯執行2)更喜歡按已啟動的順序執行任務。公平3)根據“任務活動的先驗知識”,在非活動線程之間更有效地分配任務。偷工..重要:一般來說,“異步”與“并行”不一樣。使用TaskScheduler選項,您可以在一個線程中同步執行異步任務。為了表示并行代碼執行,可以使用更高的抽象(比任務):Parallel.ForEachPLINQDataflow.

  5. 任務與C#異步/等待特性集成承諾模型,例如那里requestButton.Clicked += async (o, e) => ProcessResponce(await client.RequestAsync(e.ResourceName));執行client.RequestAsync不會阻止UI線程。重要:引擎蓋下Clicked委托調用是絕對正常的(所有線程都由編譯器完成)。

這就足以做出選擇了。如果您需要支持調用傾向于掛起的遺留API的取消功能(例如,無時間連接),并且在本例中支持Thread.Abort(),或者如果您正在創建多線程背景計算,并且希望使用掛起/恢復優化線程之間的切換,這意味著手動管理并行執行-繼續使用線程。否則就去執行任務,因為它們會讓您輕松地操作它們中的組,將它們集成到語言中,并使開發人員更有效率-任務并行庫(TPL) .


查看完整回答
反對 回復 2019-07-19
  • 3 回答
  • 0 關注
  • 501 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號