色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么是Task

汽車電子技術(shù) ? 來源:程序猿知秋 ? 作者: 程序猿知秋 ? 2023-01-20 15:07 ? 次閱讀

什么是Task?

描述

  • Task出現(xiàn)之前,微軟的多線程處理方式有:Thread→ThreadPool→委托的異步調(diào)用,雖然可以滿足基本業(yè)務(wù)場(chǎng)景,但它們?cè)诙鄠€(gè)線程的等待處理方面、資源占用方面、延續(xù)和阻塞方面都顯得比較笨拙,在面對(duì)復(fù)雜的業(yè)務(wù)場(chǎng)景下,顯得有點(diǎn)捉襟見肘
  • Task是微軟在.Net 4.0時(shí)代推出來的,也是微軟極力推薦的一種多線程的處理方式,Task看起來像一個(gè)Thread,實(shí)際上,它是在ThreadPool的基礎(chǔ)上進(jìn)行的封裝
  • Task的控制和擴(kuò)展性很強(qiáng),在線程的延續(xù)、阻塞、取消、超時(shí)等方面遠(yuǎn)勝于Thread和ThreadPool
  • Task可以簡(jiǎn)單看作相當(dāng)于Thead+TheadPool,其性能比直接使用Thread要更好,在工作中更多的是使用Task來處理多線程任務(wù)

任務(wù)Task和線程Thread的區(qū)別

  • Task是建立在Thread之上的,最終其實(shí)還是由Thread去執(zhí)行,它們都是在 System.Threading 命名空間下的
  • Task跟Thread并不是一對(duì)一的關(guān)系。比如說開啟10個(gè)任務(wù)并不一定會(huì)開啟10個(gè)線程,因?yàn)槭褂肨ask開啟新任務(wù)時(shí),是從線程池中調(diào)用線程,這點(diǎn)與ThreadPool.QueueUserWorkItem類似

Task的使用

創(chuàng)建Task的三種方式

  • 方式一:通過創(chuàng)建Task對(duì)象后調(diào)用其 Start()函數(shù)
  • 方式二:調(diào)用Task的靜態(tài)方法Run()
  • 方式三:通過Task工廠,新建一個(gè)線程
// 方式一,通過Start
Task t1 = new Task(() => { Console.WriteLine("我是Task方式一"); });
t1.Start();


// 方式二,通過Run
Task t2= Task.Run(()=>{Console.WriteLine("我是Task方式二"); });


// 方式三,通過工廠
Task t3= Task.Factory.StartNew(()=>{Console.WriteLine("我是Task方式三"); });

帶返回值與不帶返回值的Task

  • Task無(wú)返回值: 接收的是Action委托類型
  • Task有返回值: 接收的是Func委托類型
static void Main()
{
  // 沒有返回參數(shù)
  Task t1 = new Task(() => { Console.WriteLine("我是Task沒有返回參數(shù)"); });
  t1.Start();


  // 有返回參數(shù)
  Task<int> t2 = new Task<int>(() => { return 1+1; });
  t2.Start();
  int result = t2.Result;
  Console.WriteLine(result);
}

輸出結(jié)果

我是Task沒有返回參數(shù)
2

一次性建立多個(gè)任務(wù)場(chǎng)景

static void test1()
{
  Task[] taskArray = new Task[10];
  for (int i = 0; i < 10; i++)
  {
    int bb = i;
    Task t = Task.Run(() => { Console.WriteLine("任務(wù)ID:{0}, 結(jié)果:{1}",Thread.CurrentThread.ManagedThreadId, bb); });
    taskArray[i] = t;
  }
  // 等待所有任務(wù)完成
  Task.WaitAll(taskArray);
}

輸出結(jié)果

任務(wù)ID:4, 結(jié)果:0
任務(wù)ID:10, 結(jié)果:4
任務(wù)ID:7, 結(jié)果:1
任務(wù)ID:8, 結(jié)果:2
任務(wù)ID:10, 結(jié)果:7
任務(wù)ID:11, 結(jié)果:5
任務(wù)ID:9, 結(jié)果:3
任務(wù)ID:12, 結(jié)果:6
任務(wù)ID:7, 結(jié)果:8
任務(wù)ID:8, 結(jié)果:9

Task阻塞的三種方式

  • Wait(): 等待單個(gè)線程任務(wù)完成
  • WaitAll():來指定等待的一個(gè)或多個(gè)線程結(jié)束
  • WaitAny():來指定等待任意一個(gè)線程任務(wù)結(jié)束
static void test3()
{
  // 方式一: wait方法
  Task t = Task.Run(() => { Console.WriteLine("方式1:任務(wù)1......"); }) ;
  // 等待 上述任務(wù)完成
  t.Wait();
  Console.WriteLine("方式一結(jié)束..........");


  // 方式二: waitAll 方法
  Task tt = Task.Run(() => { Console.WriteLine("方式2:任務(wù)1......"); });
  Task tt2 = Task.Run(() => { Console.WriteLine("方式2:任務(wù)2......"); });
  Task.WaitAll(tt,tt2);
  Console.WriteLine("方式二結(jié)束..........");


  // 方式三:waitAny 方法
  Task ttt = Task.Run(() => { Console.WriteLine("方式3:任務(wù)1......"); });
  Task ttt2 = Task.Run(() => { Console.WriteLine("方式3:任務(wù)2......"); });
  Task.WaitAny(ttt, ttt2);
  Console.WriteLine("方式三結(jié)束..........");


}

輸出結(jié)果

方式1:任務(wù)1......
方式一結(jié)束..........
方式2:任務(wù)1......
方式2:任務(wù)2......
方式二結(jié)束..........
方式3:任務(wù)2......
方式3:任務(wù)1......
方式三結(jié)束..........

Task任務(wù)的延續(xù)

  • WhenAll().ContinueWith() : 作用是當(dāng) WhenAll() 中指定的線程任務(wù)完成后再執(zhí)行 ContinueWith() 中的任務(wù),也就是線程任務(wù)的延續(xù)。而由于這個(gè)等待是異步的,因此不會(huì)給主線程造成阻塞
  • WhenAll(task1,task2,...): Task的靜態(tài)方法,作用是異步等待指定任務(wù)完成后,返回結(jié)果。當(dāng)線程任務(wù)有返回值時(shí),返回Task對(duì)象,否則返回Task對(duì)象。
  • WhenAny() :用法與WhenAll()是一樣的,不同的是只要指定的任意一個(gè)線程任務(wù)完成則立即返回結(jié)果。
  • ContinueWith(): Task類的實(shí)例方法,異步創(chuàng)建當(dāng)另一任務(wù)完成時(shí)可以執(zhí)行的延續(xù)任務(wù)。也就是當(dāng)調(diào)用對(duì)象的線程任務(wù)完成后,執(zhí)行ContinueWith()中的任務(wù)
static void test4()
{
  Task t = Task.Run(() => { Thread.Sleep(1000); Console.WriteLine("我是線程任務(wù)....."); });
  // 異步創(chuàng)建延續(xù)任務(wù)
  Task.WhenAll(t).ContinueWith((data) => { Console.WriteLine("我是延續(xù)任務(wù)...."); });


  Console.WriteLine("這是主線程........");
  Console.ReadKey();


}

輸出結(jié)果

這是主線程........
我是線程任務(wù).....
我是延續(xù)任務(wù)....

注:Task任務(wù)的延續(xù) 與 上面阻塞相比,主要的好處就是 延續(xù)是異步的不會(huì)阻塞主線程

Task的父子任務(wù)

  • TaskCreationOptions.AttachedToParent: 用于將子任務(wù)依附到父任務(wù)中
static void test5()
{
  // 建立一個(gè)父任務(wù)
  Task parentTask = new Task(() => {
    // 創(chuàng)建兩個(gè)子任務(wù),依附在父任務(wù)上
    Task.Factory.StartNew(() => { Console.WriteLine("子task1任務(wù)。。。。。。"); }, TaskCreationOptions.AttachedToParent);
    Task.Factory.StartNew(() => { Console.WriteLine("子task2任務(wù)。。。。。。"); }, TaskCreationOptions.AttachedToParent);
    Thread.Sleep(1000);
    Console.WriteLine("我是父任務(wù)........");
  });
  parentTask.Start();
  parentTask.Wait();
  Console.WriteLine("這里是主線程.......");
  Console.ReadKey();
}

輸出結(jié)果

子task2任務(wù)。。。。。。
子task1任務(wù)。。。。。。
我是父任務(wù)........
這里是主線程.......

**Task中的任務(wù)取消 **

Task中的取消功能使用的是CanclelationTokenSource,即取消令牌源對(duì)象,可用于解決多線程任務(wù)中協(xié)作取消和超時(shí)取消

  • CancellationToken Token: CanclelationTokenSource類的屬性成員,返回CancellationToken對(duì)象,可以在開啟或創(chuàng)建線程時(shí)作為參數(shù)傳入。
  • IsCancellationRequested: 表示當(dāng)前任務(wù)是否已經(jīng)請(qǐng)求取消。Token類中也有此屬性成員,兩者互相關(guān)聯(lián)。
  • Cancel(): CanclelationTokenSource類的實(shí)例方法,取消線程任務(wù),同時(shí)將自身以及關(guān)聯(lián)的Token對(duì)象中的IsCancellationRequested屬性置為true。
  • CancelAfter(int millisecondsDelay) :CanclelationTokenSource類的實(shí)例方法,用于延遲取消線程任務(wù)。

取消任務(wù)的兩種情況

  • 情況一: 通過Cancel()方法
  • 情況二: 通過CancelAfter(milliseconds) 方法
static void test6()
{
  // 情況一: 直接取消
  // 創(chuàng)建取消令牌源對(duì)象
  CancellationTokenSource cst = new CancellationTokenSource();
  //第二個(gè)參數(shù)傳入取消令牌
  Task t = Task.Run(() => {
    while (!cst.IsCancellationRequested)
    {
      Thread.Sleep(500);
      Console.WriteLine("情況一,沒有接收到取消信號(hào)......");
    }
  }, cst.Token);


  Thread.Sleep(1000);
  //1秒后結(jié)束
  cst.Cancel(); 
  Console.ReadKey();




  // 情況二: 延遲取消
  CancellationTokenSource cst2 = new CancellationTokenSource();
  Task t2 = Task.Run(() => {
    while (!cst2.IsCancellationRequested)
    {
      Console.WriteLine("情況二,沒有接收到取消信號(hào)......");
    }
  }, cst2.Token);
  //1秒后結(jié)束
  cst2.CancelAfter(1000);
  Console.ReadKey();
}

**Task跨線程訪問界面控件 **

通過 TaskScheduler.FromCurrentSynchronizationContext() 獲取TaskScheduler,并將其放入Task的start() 方法中 或 放入延續(xù)方法中即可

  • 放入start() 方法中
  • 放入 ContinueWith() 延續(xù)方法中
// 通過start方法
private void button1_Click(object sender, EventArgs e)
{
    Task t = new Task(() =>
    {
        // 為界面控件賦值
    this.textBox1.Text = "線程內(nèi)賦值";
    });

    task.Start(TaskScheduler.FromCurrentSynchronizationContext());
}




// 通過延續(xù)方法
private void button1_Click(object sender, EventArgs e)
{
    Task.Run(() =>
    {
      Thread.Sleep(1000);
    }).ContinueWith(t => {
      this.textBox1.Text = "線程內(nèi)賦值";
    }, TaskScheduler.FromCurrentSynchronizationContext());
}

Task的異常處理

異常捕獲

  • Task線程的異常處理 不能直接將線程對(duì)象相關(guān)代碼try-catch來捕獲 ,需要通過調(diào)用線程對(duì)象的wait()函數(shù)來進(jìn)行線程的異常捕獲
  • 線程的異常會(huì)聚合到AggregateException異常對(duì)象中(AggregateException是專門用來收集線程異常的異常類),多個(gè)異常 需要通過遍歷該異常對(duì)象來獲取異常信息
  • 如果捕獲到線程異常之后,還想繼續(xù)往上拋出,就需要調(diào)用AggregateException對(duì)象的Handle函數(shù),并返回false。(Handle函數(shù)遍歷了一下AggregateException對(duì)象中的異常)
static void test7()
{
  Task t = Task.Run(() =>
  {
    throw new Exception("異常拋出.....");
  });


  try
  {
    t.Wait();
  }
  catch (AggregateException ex)
  {
    Console.Error.WriteLine(ex.Message);


    foreach (var item in ex.InnerExceptions)
    {
      Console.WriteLine("內(nèi)異常:"+item.Message);
    }
    //將異常往外拋出
    // ex.Handle(p => false);
  }
  Console.ReadKey();
}

輸出結(jié)果

One or more errors occurred. (異常拋出.....)
內(nèi)異常:異常拋出.....
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 微軟
    +關(guān)注

    關(guān)注

    4

    文章

    6671

    瀏覽量

    105366
  • 線程
    +關(guān)注

    關(guān)注

    0

    文章

    507

    瀏覽量

    20071
  • Thread
    +關(guān)注

    關(guān)注

    2

    文章

    87

    瀏覽量

    26366
收藏 0人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    鴻蒙內(nèi)核源碼Task/線程技術(shù)分析

    前言 在鴻蒙內(nèi)核中,廣義上可理解為一個(gè)Task就是一個(gè)線程 一、怎么理解Task 1. 官方文檔是怎么描述線程 基本概念 從系統(tǒng)的角度看,線程是競(jìng)爭(zhēng)系統(tǒng)資源的最小運(yùn)行單元。線程可以使用或等待CPU
    的頭像 發(fā)表于 10-18 10:42 ?2466次閱讀
    鴻蒙內(nèi)核源碼<b class='flag-5'>Task</b>/線程技術(shù)分析

    高速接口MIPI DPHY配置task函數(shù)

    景芯SoC訓(xùn)練營(yíng)有同學(xué)問Verdi如何加載task函數(shù)里面的波形,這里以高速圖像接口MIPI為例,給大家介紹下吧。
    的頭像 發(fā)表于 11-18 16:59 ?1163次閱讀
    高速接口MIPI DPHY配置<b class='flag-5'>task</b>函數(shù)

    RAW task

    這篇文檔會(huì)主要選擇些API講解,讀者可以對(duì)著代碼仔細(xì)理解。1 RAW_U16 raw_task_create(RAW_TASK_OBJ*task_obj, RAW_U8*task
    發(fā)表于 02-27 14:00

    task問題

    背景如下:小弟想用一個(gè)task實(shí)現(xiàn)16個(gè)時(shí)鐘周期的延遲,然后產(chǎn)生一標(biāo)志位cnt_key用作后面語(yǔ)句的激勵(lì),但用modlesim仿真的時(shí)候cnt_key沒有起到激勵(lì)作用,程序如下,請(qǐng)各路大神幫忙指點(diǎn)下
    發(fā)表于 06-12 10:11

    AWR1642開發(fā),使用Task_create創(chuàng)建了多個(gè)task,請(qǐng)問task都沒有運(yùn)行是怎么回事?

    AWR1642開發(fā),使用Task_create創(chuàng)建了多個(gè)tasktask都沒有運(yùn)行是怎么回事。在main中創(chuàng)建了task,還需要在哪里初始化嗎?
    發(fā)表于 08-08 08:29

    【HarmonyOS】Task/線程管理篇

    原文鏈接:https://my.oschina.net/u/3751245/blog/4595539本文分析Task/線程管理源碼 詳見:los_task.c目錄前言一、怎么理解Task1. 官方
    發(fā)表于 10-19 14:54

    簡(jiǎn)談FPGA verilog中的task用法

    ????????大家好,又到了每日學(xué)習(xí)的時(shí)間了,今天我們來聊一聊FPGA verilog中的task用法。 ? ? ? ?任務(wù)就是一段封裝在“task-endtask”之間的程序。任務(wù)是通過調(diào)用
    的頭像 發(fā)表于 08-09 18:59 ?4.1w次閱讀

    如何進(jìn)行Android中Task任務(wù)棧的分配

    這意思就是說Task實(shí)際上是一個(gè)Activity棧,通常用戶感受的一個(gè)Application就是一個(gè)Task。從這個(gè)定義來看,Task跟Service或者其他Components是沒有任何聯(lián)系的,它
    發(fā)表于 07-03 17:42 ?0次下載
    如何進(jìn)行Android中<b class='flag-5'>Task</b>任務(wù)棧的分配

    帶你了解 TensorFlow Lite Task Library模型接口

    額外的代碼來處理復(fù)雜的邏輯,如數(shù)據(jù)轉(zhuǎn)換、預(yù)處理/后處理、加載關(guān)聯(lián)文件等。 額外的代碼 今天,我們將為大家介紹 TensorFlow Lite Task Library,這是一組功能強(qiáng)大且易于使用的模型
    的頭像 發(fā)表于 09-30 10:26 ?2530次閱讀

    RTA OS系列介紹01-Task

    AUTOSAR OS主要包含Task, ISRs, Events, Resources, Application, Counter, Alarms, Schedule Table等OS對(duì)象。后續(xù)將對(duì)如上提到的八個(gè)對(duì)象進(jìn)行分別介紹,本篇介紹的內(nèi)容為Task,下面進(jìn)入正題:
    的頭像 發(fā)表于 12-21 14:13 ?2651次閱讀

    verilog中的task用法

    任務(wù)就是一段封裝在“task-endtask”之間的程序。任務(wù)是通過調(diào)用來執(zhí)行的,而且只有在調(diào)用時(shí)才執(zhí)行,如果定義了任務(wù),但是在整個(gè)過程中都沒有調(diào)用它,那么這個(gè)任務(wù)是不會(huì)執(zhí)行的。調(diào)用某個(gè)任務(wù)時(shí)可能
    的頭像 發(fā)表于 03-23 15:13 ?1521次閱讀

    Verdi查看task內(nèi)部變量

    任務(wù)(task)可以用來描述共同的代碼段,并在模塊內(nèi)任意位置被調(diào)用,讓代碼更加的直觀易讀。task 更像一個(gè)過程,過程內(nèi)一般按順序執(zhí)行,完成各種邏輯控制。
    的頭像 發(fā)表于 03-26 16:08 ?6655次閱讀
    Verdi查看<b class='flag-5'>task</b>內(nèi)部變量

    verilog中的task用法介紹

    任務(wù)就是一段封裝在“task-endtask”之間的程序。任務(wù)是通過調(diào)用來執(zhí)行的,而且只有在調(diào)用時(shí)才執(zhí)行
    的頭像 發(fā)表于 06-05 16:21 ?2041次閱讀

    verilog中function和task的區(qū)別

    在Verilog中,F(xiàn)unction和Task是用于模塊化設(shè)計(jì)和重用代碼的兩種重要元素。它們?cè)试S開發(fā)人員將復(fù)雜的操作分解為更小的功能單元,并在需要時(shí)調(diào)用它們。雖然Function和Task在某些方面
    的頭像 發(fā)表于 02-22 15:40 ?2421次閱讀

    verilog task和function區(qū)別

    verilog中的task和function都是用于實(shí)現(xiàn)模塊中的可重復(fù)的功能,并且可以接收參數(shù)和返回結(jié)果。但是它們?cè)诰帉懞褪褂蒙嫌幸恍﹨^(qū)別。下面將詳細(xì)介紹task和function的區(qū)別。 語(yǔ)法結(jié)構(gòu)
    的頭像 發(fā)表于 02-22 15:53 ?1499次閱讀
    主站蜘蛛池模板: 精品无码一区二区三区中文字幕 | 成人18视频在线 | 国产免费看片 | 99re精品视频在线播放视频 | 亚洲99精品A片久久久久久 | 成人免费视频在线看 | 亚洲一区二区三区免费看 | 2020久久精品永久免费 | 久久一级片 | 我要女人的全黄录像 | 小箩莉奶水四溅小说 | 国产精品人妻一区免费看8C0M | 欧美精品AV一区二区无码 | 5580免费午夜福利院 | 国产午夜在线精品三级a午夜电影 | 午夜福利院电影 | 日日a.v拍夜夜添久久免费 | 中国xxx视频 | 欧美内射深插日本少妇 | 亚洲国产精品久久无套麻豆 | 亚洲日本香蕉视频观看视频 | 日韩亚洲欧洲在线rrrr片 | 久热这里只有精品99国产6 | 色噜噜狠狠色综合中文字幕 | 男女午夜性爽快免费视频不卡 | 视频一区亚洲视频无码 | 美女被撕开胸罩狂揉大乳 | 少妇高潮久久久久7777 | 99精品视频免费观看 | 中文字幕一区二区视频 | 日本xxx在线观看免费播放 | 国产全部视频列表支持手机 | 中文字幕在线观看 | 久草在线一免费新视频 | 美女国产毛片A区内射 | 视频一区亚洲视频无码 | 色怕怕| 公交车被CAO到合不拢腿 | 99在线观看 | 公主纯肉高H文 | 日本真人啪啪试看30秒 |

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品