欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#如何使用Task執(zhí)行異步操作

 更新時(shí)間:2021年05月06日 08:57:39   作者:HarryK  
這篇文章主要介紹了C#如何使用Task執(zhí)行異步操作,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下

為什么要使用 Task

線程是創(chuàng)建并發(fā)的底層工具,因此具有一定的局限性。

  • 沒有簡(jiǎn)單的方法可以從聯(lián)合(Join)線程得到“返回值”。因此必須創(chuàng)建一些共享域。當(dāng)拋出一個(gè)異常時(shí),捕捉和處理異常也是麻煩的。
  • 線程完成之后,無(wú)法再次啟動(dòng)該線程。相反,只能聯(lián)合(Join)它(在進(jìn)程阻塞當(dāng)前線程)。

任務(wù)是可組合的——使用延續(xù)將它們串聯(lián)在一起。它們可以使用線程池減少啟動(dòng)延遲,而且它們可以通過TaskCompletionSource使用回調(diào)方法,避免多個(gè)線程同時(shí)等待I/O密集操作。

Task 和 Thread 區(qū)別

1、任務(wù)是架構(gòu)在線程之上的,也就是說(shuō)任務(wù)最終還是要拋給線程去執(zhí)行。

2、任務(wù)跟線程不是一對(duì)一的關(guān)系,比如開10個(gè)任務(wù)并不是說(shuō)會(huì)開10個(gè)線程,這一點(diǎn)任務(wù)有點(diǎn)類似線程池,但是任務(wù)相比線程池有很小的開銷和精確的控制。

Task和Thread一樣,位于System.Threading命名空間下

與線程相比,Task是一個(gè)更高級(jí)的抽象概念,它標(biāo)識(shí)一個(gè)通過或不通過線程實(shí)現(xiàn)的并發(fā)操作。

Task 介紹

Task 類的表示單個(gè)操作不返回一個(gè)值,通常以異步方式執(zhí)行。 Task 對(duì)象是一個(gè)的中心思想 基于任務(wù)的異步模式 首次引入.NET Framework 4 中。 因?yàn)橛蓤?zhí)行工作 Task 對(duì)象通常以異步方式執(zhí)行在線程池線程上而不是以同步方式在主應(yīng)用程序線程,您可以使用 Status 屬性,以及 IsCanceled, ,IsCompleted, ,和 IsFaulted 屬性,以確定任務(wù)的狀態(tài)。 大多數(shù)情況下,lambda 表達(dá)式用于指定的任務(wù)是執(zhí)行的工作。

Task 簡(jiǎn)單實(shí)現(xiàn)

通過使用Task的構(gòu)造函數(shù)來(lái)創(chuàng)建任務(wù),并調(diào)用Start方法來(lái)啟動(dòng)任務(wù)并執(zhí)行異步操作。

static void Main(string[] args)
{
        Console.WriteLine("主線程執(zhí)行業(yè)務(wù)處理.");
        //創(chuàng)建任務(wù)
        Task task = new Task(() => {
            Console.WriteLine("使用System.Threading.Tasks.Task執(zhí)行異步操作.");
            for (int i = 0; i < 10; i++)
            {
                  Console.WriteLine(i);
            }
      });
     //啟動(dòng)任務(wù),并安排到當(dāng)前任務(wù)隊(duì)列線程中執(zhí)行任務(wù)
      task.Start();
      Console.WriteLine("主線程執(zhí)行其他處理");
}

從Framework 4.5開始,啟動(dòng)一個(gè)由后臺(tái)線程實(shí)現(xiàn)的Task,也可以使用靜態(tài)方法 Task.Run

Task task = Task.Run(() =>
    {
        Thread.Sleep(2000);
        Console.WriteLine("Foo");
    });

Task默認(rèn)使用線程池,它們都是后臺(tái)線程。意味當(dāng)主線程結(jié)束時(shí),所有任務(wù)都會(huì)隨之停止。

Task 執(zhí)行狀態(tài)

1.等待(Wait)

調(diào)用Wait方法,可以阻塞任務(wù),直至任務(wù)完成,效果等同于Thread.Join:

Task task = Task.Run(() =>
    {
        Thread.Sleep(2000);
        Console.WriteLine("Foo");
    });
    Console.WriteLine(task.IsCompleted); //False
    task.Wait();//阻塞,直至任務(wù)完成
    Console.WriteLine(task.IsCompleted); //True
    Console.ReadLine();

2. 返回值

Task<TResult>允許任務(wù)返回一個(gè)值。調(diào)用Task.Run,傳入一個(gè)Func<TResult>代理(或者兼容的Lambda表達(dá)式),代替Action,就可以獲得一個(gè)Task<TResult>:

Task<int> task = Task.Run (() => { Console.WriteLine ("Foo"); return 3; });

int result = task.Result;      // Blocks if not already finished
Console.WriteLine (result);    // 3

下面的例子創(chuàng)建一個(gè)任務(wù),它使用LINQ就按前3百萬(wàn)個(gè)整數(shù)(從2開始)中的素?cái)?shù)個(gè)數(shù):

Task<int> primeNumberTask = Task.Run(() =>
        Enumerable.Range(2, 3000000).Count(n => Enumerable.Range(2, (int)Math.Sqrt(n) - 1).All(i => n % i > 0)));

    Console.WriteLine("Task running...");
    Console.WriteLine("The answer is " + primeNumberTask.Result);

這段代碼會(huì)打印“Task running...”,然后幾秒鐘后打印216815。

3. Task.Delay

Task.Delay是Thread.Sleep的異步版本

Task.Delay(5000).GetAwaiter().OnCompleted(()=>Console.WriteLine(42));

或者

Task.Delay(5000).ContinueWith(ant => Console.WriteLine(42));

以上就是C#如何使用Task執(zhí)行異步操作的詳細(xì)內(nèi)容,更多關(guān)于c# 用Task執(zhí)行異步操作的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C# 讀取指定路徑配置文件的方法

    C# 讀取指定路徑配置文件的方法

    為了實(shí)現(xiàn)多個(gè)C#程序共用一個(gè)config文件,需要程序讀取指定路徑的config文件。代碼如下:
    2013-03-03
  • C#橋接模式完整實(shí)例

    C#橋接模式完整實(shí)例

    這篇文章主要介紹了C#橋接模式,以實(shí)例形式較為詳細(xì)的分析了C#橋接模式的實(shí)現(xiàn)原理與相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • C#實(shí)現(xiàn)rar壓縮與解壓縮文件的方法

    C#實(shí)現(xiàn)rar壓縮與解壓縮文件的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)rar壓縮與解壓縮文件的方法,實(shí)例分析了C#利用winrar程序?qū)崿F(xiàn)文件的壓縮與解壓縮的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • C# 6.0 新特性匯總

    C# 6.0 新特性匯總

    這篇文章主要介紹了C# 6.0 新特性匯總的相關(guān)資料,本文給大家?guī)?lái)了11種新特征,非常不錯(cuò),感興趣的朋友一起看看吧
    2016-09-09
  • c#多種加解密示例(md5加密解密)

    c#多種加解密示例(md5加密解密)

    這篇文章主要介紹了c#多種加解密示例,包括了MD5加密,SHA1加密,DES加解密,需要的朋友可以參考下
    2014-03-03
  • C#利用IDbCommand實(shí)現(xiàn)通用數(shù)據(jù)庫(kù)腳本執(zhí)行程序

    C#利用IDbCommand實(shí)現(xiàn)通用數(shù)據(jù)庫(kù)腳本執(zhí)行程序

    在.net 應(yīng)用中,在數(shù)據(jù)庫(kù)中執(zhí)行腳本程序是經(jīng)常用到的功能,如數(shù)據(jù)操作(新增、修改、刪除等),執(zhí)行一個(gè)存儲(chǔ)過程等,本文將介紹如何通過利用IDbCommand 實(shí)現(xiàn)通用數(shù)據(jù)庫(kù)腳本執(zhí)行程序,感興趣的朋友可以參考下
    2024-04-04
  • C#中async和await的深入分析

    C#中async和await的深入分析

    Async/Await是C# 5引入的關(guān)鍵字,用以提高用戶界面響應(yīng)能力和對(duì)Web資源的訪問能力,同時(shí)它使異步代碼的編寫變得更加容易,下面這篇文章主要給大家介紹了關(guān)于C#中async和await的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • 關(guān)于WPF異步MVVM等待窗體的介紹

    關(guān)于WPF異步MVVM等待窗體的介紹

    本篇文章小編將為大家介紹,關(guān)于WPF異步MVVM等待窗體的介紹,需要的朋友參考下
    2013-04-04
  • C#中IList 與 List 的區(qū)別小結(jié)

    C#中IList 與 List 的區(qū)別小結(jié)

    IList 接口和 List 類是 C# 中用于集合操作的兩個(gè)重要的類型,本文主要介紹了C#中IList 與 List 的區(qū)別小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-04-04
  • C#實(shí)現(xiàn)異步編程的方法

    C#實(shí)現(xiàn)異步編程的方法

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)異步編程的方法,什么是異步,如何實(shí)現(xiàn)異步編程,感興趣的小伙伴們可以參考一下
    2017-07-07

最新評(píng)論