最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中Task異步的常用方法

 更新時(shí)間:2025年07月07日 09:39:06   作者:xiaowu080  
Task是微軟極力推薦的一種多線程處理方式,在線程的延續(xù)、取消,以及多個(gè)線程的等待處理等方面要優(yōu)于Thread,ThreadPool,以下介紹的是Task的常用方法,需要的朋友可以參考下

C# 中的 Task 類是 System.Threading.Tasks 命名空間的一部分,用于表示異步操作。

一、Task.Run(Action action):

此靜態(tài)方法用于在后臺(tái)運(yùn)行一個(gè)新任務(wù),并返回與該任務(wù)關(guān)聯(lián)的 Task 實(shí)例。

  1. 本質(zhì)是將任務(wù)放入線程池執(zhí)行,自動(dòng)啟動(dòng),適合CPU 密集型或簡(jiǎn)單異步操作
  2. 注意:返回的 Task 無法手動(dòng)控制啟動(dòng)(已自動(dòng)啟動(dòng))。
Task.Run(() => Console.WriteLine("后臺(tái)執(zhí)行"));

二、Task.Start():

用于手動(dòng)啟動(dòng)通過 new Task(...) 創(chuàng)建的未啟動(dòng)任務(wù)(默認(rèn)狀態(tài)為 Created)。

var task = new Task(() => Console.WriteLine("手動(dòng)啟動(dòng)"));
task.Start(); // 必須調(diào)用才會(huì)執(zhí)行

三、Task.Delay(int millisecondsDelay):

此靜態(tài)方法創(chuàng)建一個(gè)在指定延遲之后完成的 Task。這對(duì)于定時(shí)操作或模擬長(zhǎng)時(shí)間運(yùn)行的任務(wù)非常有用。

await Task.Delay(1000); // 等待1秒

四、任務(wù)等待相關(guān)方法(阻塞 vs 非阻塞)

方法特性適用場(chǎng)景
await Task.WhenAll非阻塞等待所有任務(wù)完成異步方法中,需要等待多個(gè)任務(wù)全部完成后再繼續(xù)
await Task.WhenAny非阻塞等待任一任務(wù)完成異步方法中,只需等待最快完成的任務(wù)結(jié)果
Task.WaitAll阻塞當(dāng)前線程等待所有任務(wù)同步方法中強(qiáng)制等待(不推薦在異步代碼中使用)
Task.WaitAny阻塞當(dāng)前線程等待任一任務(wù)同步方法中需立即響應(yīng)第一個(gè)完成的任務(wù)
Task.Wait()阻塞當(dāng)前線程等待單個(gè)任務(wù)同步方法中等待單個(gè)任務(wù)(等價(jià)于 WaitAll 單任務(wù))

關(guān)鍵區(qū)別

  1. await 搭配 WhenAll/WhenAny 是非阻塞等待,會(huì)釋放當(dāng)前線程,適合異步上下文(如 UI 線程),避免界面卡頓。
  2. Wait()/WaitAll()/WaitAny() 是阻塞等待,會(huì)凍結(jié)當(dāng)前線程,可能導(dǎo)致性能問題(如 UI 無響應(yīng)),僅建議在純同步代碼中使用。

1.Task.WhenAll(Task[] tasks):

注意:由于此調(diào)用不會(huì)默認(rèn)等待,需要再前面添加await。

var task1 = Task.Run(() => { /* 任務(wù)1 */ });
var task2 = Task.Run(() => { /* 任務(wù)2 */ });
 
await Task.WhenAll(task1, task2);

2.Task.WhenAny(Task[] tasks):

注意:由于此調(diào)用不會(huì)默認(rèn)等待,需要再前面添加await。

var task1 = Task.Run(() => { /* 任務(wù)1 */ });
var task2 = Task.Run(() => { /* 任務(wù)2 */ });
 
var completedTask = await Task.WhenAny(task1, task2);

3.Task.Wait():

var task = Task.Run(() => { /* 代碼 */ });
task.Wait();

4.Task.WaitAll(Params Task[])

var task1 = Task.Run(() => { /* 任務(wù)1 */ });
var task2 = Task.Run(() => { /* 任務(wù)2 */ });
 
var completedTask = Task.WaitAll(task1, task2);

5.Task.WaitAny(Params Task[])

var task1 = Task.Run(() => { /* 任務(wù)1 */ });
var task2 = Task.Run(() => { /* 任務(wù)2 */ });
 
var completedTask = Task.WaitAny(task1, task2);

五、Task.ContinueWith(Action continuationAction):

此方法用于在當(dāng)前任務(wù)完成后執(zhí)行另一個(gè)操作。這對(duì)于鏈?zhǔn)?嵌套)任務(wù)執(zhí)行非常有用。(等待一個(gè)任務(wù)完成)  

// 正常情況下 t1 和 t2 不知道誰先執(zhí)行完
Task<string> t1 = new Task<string>(F1);
Task<string> t2 = new Task<string>(F2);
Task<string> t3 = new Task<string>(F3);
 
//t1先執(zhí)行 t2后執(zhí)行 
t1.ContinueWith(t =>
{
    // t1執(zhí)行完之后 再去執(zhí)行
    t2.Start(); //第二任務(wù)
    t2.ContinueWith(t4 =>
    {
        //第二個(gè)任務(wù)完成了
        //第三個(gè)任務(wù)對(duì)象
        t3.Start();
        t3.ContinueWith(t5 =>
        {
            Console.WriteLine("保證第三個(gè)任務(wù)完成");
        });
    });
});

注意:在使用 Task 類時(shí),應(yīng)始終考慮處理異常和取消操作。這可以通過使用 try-catch 語句和 CancellationToken 來實(shí)現(xiàn)。

到此這篇關(guān)于C#中Task異步的常用方法的文章就介紹到這了,更多相關(guān)C# Task異步用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#實(shí)現(xiàn)給圖片添加文字水印的示例代碼

    C#實(shí)現(xiàn)給圖片添加文字水印的示例代碼

    在某些應(yīng)用項(xiàng)目中,查看電子圖片信息是經(jīng)常使用到的功能,此時(shí)我們就需要給顯示在瀏覽器中的圖片添加文字水印版權(quán)或提示信息,下面我們就來看看如何使用C#實(shí)現(xiàn)給圖片添加文字水印吧
    2024-04-04
  • 不用IDE寫C#的Hello World的方法

    不用IDE寫C#的Hello World的方法

    這篇文章主要介紹了不用IDE寫C#的Hello World的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2015-10-10
  • 淺析C# 委托(Delegate)

    淺析C# 委托(Delegate)

    這篇文章主要介紹了C# 委托(Delegate)的相關(guān)資料,文中講解非常詳細(xì),代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • C#使用iText獲取PDF的trailer數(shù)據(jù)的代碼示例

    C#使用iText獲取PDF的trailer數(shù)據(jù)的代碼示例

    開發(fā)程序debug的時(shí)候,看到了PDF有個(gè)trailer數(shù)據(jù),挺有意思,于是考慮用代碼把它讀出來,那么就用到我們常用的iText框架了,所以本文將詳細(xì)介紹C#使用iText獲取PDF的trailer數(shù)據(jù)的方法步驟,需要的朋友可以參考下
    2025-09-09
  • C#入門之窗體的簡(jiǎn)單用法實(shí)例

    C#入門之窗體的簡(jiǎn)單用法實(shí)例

    這篇文章主要介紹了C#入門之窗體的簡(jiǎn)單用法,以實(shí)例形式分析了注冊(cè)頁(yè)面程序的實(shí)現(xiàn)過程,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-12-12
  • C#實(shí)現(xiàn)計(jì)算年齡的簡(jiǎn)單方法匯總

    C#實(shí)現(xiàn)計(jì)算年齡的簡(jiǎn)單方法匯總

    本文給大家分享的是C#代碼實(shí)現(xiàn)的簡(jiǎn)單實(shí)用的給出用戶的出生日期,計(jì)算出用戶的年齡的代碼,另外附上其他網(wǎng)友的方法,算是對(duì)計(jì)算年齡的一次小結(jié),希望大家能夠喜歡。
    2015-05-05
  • C#判斷字符串是否是int/double(實(shí)例)

    C#判斷字符串是否是int/double(實(shí)例)

    本文主要分享了C#判斷字符串是否是int/double的具體實(shí)例,具有一定的參考價(jià)值,需要的朋友一起來看下吧
    2016-12-12
  • .Net?Core以windows服務(wù)方式部署

    .Net?Core以windows服務(wù)方式部署

    這篇文章介紹了.Net?Core以windows服務(wù)方式部署,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • 基于C#調(diào)用OCX控件的常用方法(推薦)

    基于C#調(diào)用OCX控件的常用方法(推薦)

    下面小編就為大家分享一篇基于C#調(diào)用OCX控件的常用方法推薦,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • C#程序加密與解密的流程步驟

    C#程序加密與解密的流程步驟

    文章介紹了一種基于CPU和硬盤編碼的C#程序加密方法,包括生成、驗(yàn)證和保存注冊(cè)碼的過程,以及如何在用戶軟件和解密程序中實(shí)現(xiàn)這一功能,文中通過代碼示例和圖文講解的非常詳細(xì),需要的朋友可以參考下
    2025-03-03

最新評(píng)論

青川县| 乐平市| 湟中县| 吐鲁番市| 泾源县| 个旧市| 雅江县| 延边| 拉萨市| 富阳市| 固安县| 卢龙县| 拉萨市| 靖江市| 永靖县| 永平县| 北辰区| 马尔康县| 扎鲁特旗| 油尖旺区| 平武县| 宁国市| 彭水| 尚志市| 宜兴市| 奉新县| 临夏市| 清苑县| 九江市| 鹤岗市| 奈曼旗| 瑞金市| 三原县| 云和县| 砀山县| 巴塘县| 新津县| 红原县| 台前县| 罗田县| 板桥市|