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

c#?Task.Wait()與awaiat?Task異常處理的區(qū)別說明

 更新時間:2022年06月09日 11:44:40   作者:皮皮君  
這篇文章主要介紹了c#?Task.Wait()與awaiat?Task異常處理的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Task.Wait()與awaiat Task異常處理區(qū)別

Task異常處理

下面有兩個例子代碼,可以直接復(fù)制粘貼到.net core中運行。兩個代碼要實現(xiàn)的功能完全一樣,但是內(nèi)核卻又很大差異。

先看下面用await的例子與輸出:

using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
    static async Task Main()
    {
        System.Console.WriteLine($"Main Task ID:{Thread.CurrentThread.ManagedThreadId}");
        var task = Task.Run(() =>
        {
            System.Console.WriteLine($"In Task.Run(), Task ID:{Thread.CurrentThread.ManagedThreadId}");
            int[] vary=new int[5];
            while (true)
            {
               Thread.Sleep(3000);
               int d = vary[6];
            }
        });
        // Just continue on this thread, or await with try-catch:
        try
        {
            await task;
        }
        catch (IndexOutOfRangeException ex)
        {
            System.Console.WriteLine(ex.Message);
            System.Console.WriteLine($"After Wait(), Task ID:{Thread.CurrentThread.ManagedThreadId}");
        }
        catch(AggregateException ex)
        {
           System.Console.WriteLine(ex.Message);
           System.Console.WriteLine($"After Wait(), Task ID:{Thread.CurrentThread.ManagedThreadId}");
        }
        finally
        {
            //...
        }
        System.Console.WriteLine("Reach end.");
        Console.ReadKey();
    }
}
/*
Main Task ID:1
In Task.Run(), Task ID:4
Index was outside the bounds of the array.
Catch System.IndexOutOfRangeException
After Wait(), Task ID:4
Reach end.
*/

再看Task.Wait()方法下的異常處理與輸出:

using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
    static void Main()
    {
        System.Console.WriteLine($"Main Task ID:{Thread.CurrentThread.ManagedThreadId}");
        var task = Task.Run(() =>
        {
            System.Console.WriteLine($"In Task.Run(), Task ID:{Thread.CurrentThread.ManagedThreadId}");
            int[] vary=new int[5];
            while (true)
            {
               Thread.Sleep(3000);
               int d = vary[6];
            }
        });
        // Just continue on this thread, or await with try-catch:
        try
        {
            task.Wait();
        }
        catch (IndexOutOfRangeException ex)
        {
            System.Console.WriteLine($"Catch {ex.GetType()}");
            System.Console.WriteLine($"After Wait(), Task ID:{Thread.CurrentThread.ManagedThreadId}");
        }
        catch(AggregateException ex)
        {
           System.Console.WriteLine($"Catch {ex.GetType()}");
           System.Console.WriteLine($"After Wait(), Task ID:{Thread.CurrentThread.ManagedThreadId}");
        }
        finally
        {
            //...
        }
        System.Console.WriteLine("Reach end.");
        Console.ReadKey();
    }
}
/*
Main Task ID:1
In Task.Run(), Task ID:4
Catch System.AggregateException
One or more errors occurred. (Index was outside the bounds of the array.)
After Wait(), Task ID:1
Reach end.
*/

從例子中可以看出,await之后的代碼其實都是在新的線程(4線程)中執(zhí)行,而Task.Wait()方法后的線程則是在主線程中執(zhí)行。

因此,await之后的代碼完全以傳統(tǒng)方式處理異常;而Task.Wait()拋出的異常則由于是從新線程往外部線程拋出,所以它是被重新封裝為AggregateException異常拋出。

Task.WaitAll()注意事項

使用Task.WaitAll() 等待多任務(wù)執(zhí)行完畢的時候發(fā)現(xiàn),等待的任務(wù)還沒結(jié)束,Task.WaitAll() 就先結(jié)束了,于是就寫了一段測試代碼進(jìn)行驗證。

先上代碼

        static void Main(string[] args)
        {
            //建立兩個任務(wù)
            Task t1 = new Task(async () => await T1());
            Task t2 = new Task(async () => await T2());
            //啟動任務(wù)
            t1.Start();
            t2.Start();
            //等待任務(wù)完成
            Task.WaitAll(t1, t2);
            Print("WaitAll Done");
 
            Console.ReadLine();
        }
        
        static async Task T1()
        {
            Print("T1 Start");
            Thread.Sleep(1000);
            Print("T1 await");
            await Task.Delay(1000);
            Print("T1 Done");
        }
 
        static async Task T2()
        {
            Print("T2 Start");
            Thread.Sleep(1000);
            Print("T2 await");
            await Task.Delay(1000);
            Print("T2 Done");
        }
 
        static void Print(string msg)
        {
            Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.ffffff")}: {msg}");
        }

再上結(jié)果,注意看T1、T2 Done 和 WaitAll Done的打印時間: 

果然,坑!

Task.WaitAll() 盡然比等待的Task先結(jié)束。

總結(jié):(不推薦,請看補充內(nèi)容)

new Task().Start() 中一旦使用 await ,會立馬返回結(jié)束狀態(tài)。

所以,在使用 Task.WaitAll()  或其接續(xù)任務(wù)的時候,可以考慮使用 Thead.sleep() 替代 await  Task.Delay() 。

2022-04-25 補充:

經(jīng)過【32號就放假】提醒,測試了Task.Run() 和 Task.Factory.StartNew()兩個方法,得出結(jié)論:

1、 在Task.Run()啟動任務(wù)中,await會正常運行;(推薦使用)

        static void Main(string[] args)
        {
            //建立兩個任務(wù)
            Task t1 = Task.Run(T1);
            Task t2 = Task.Run(T2);
            //等待任務(wù)完成
            Task.WaitAll(t1, t2);
            Print("WaitAll Done");
 
            Console.ReadLine();
        }

2、在Task.Factory.StartNew() 啟動任務(wù)中,會立馬返回結(jié)束狀態(tài)。

        static void Main(string[] args)
        {
            //建立兩個任務(wù)
            Task t1 = Task.Factory.StartNew(T1);
            Task t2 = Task.Factory.StartNew(T2);
            //等待任務(wù)完成
            Task.WaitAll(t1, t2);
            Print("WaitAll Done");
 
            Console.ReadLine();
        }

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#實現(xiàn)套接字發(fā)送接收數(shù)據(jù)

    C#實現(xiàn)套接字發(fā)送接收數(shù)據(jù)

    這篇文章主要為大家詳細(xì)介紹了C#實現(xiàn)套接字發(fā)送接收數(shù)據(jù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C#中方法的直接調(diào)用、反射調(diào)用與Lambda表達(dá)式調(diào)用對比

    C#中方法的直接調(diào)用、反射調(diào)用與Lambda表達(dá)式調(diào)用對比

    這篇文章主要介紹了C#中方法的直接調(diào)用、反射調(diào)用與Lambda表達(dá)式調(diào)用對比,本文著重講解了方法的三種調(diào)用方法以及它們的性能對比,需要的朋友可以參考下
    2015-06-06
  • C#以流方式讀socket超時設(shè)置的實例

    C#以流方式讀socket超時設(shè)置的實例

    這篇文章主要為大家詳細(xì)介紹了C#以流方式讀socket超時設(shè)置的實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • C#入門之定義類成員與接口實現(xiàn)

    C#入門之定義類成員與接口實現(xiàn)

    這篇文章介紹了C#入門之定義類成員與接口實現(xiàn),文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • 解析XPath語法之在C#中使用XPath的示例詳解

    解析XPath語法之在C#中使用XPath的示例詳解

    本篇文章是對在C#中使用XPath的示例進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 一篇文章弄懂C#中的async和await

    一篇文章弄懂C#中的async和await

    這篇文章主要給大家介紹了如何通過一篇文章弄懂C#中async和await的相關(guān)資料,async和await相信大家應(yīng)該不陌生,讓異步處理變得更友好,本文通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-07-07
  • C# OpenCVSharp實現(xiàn)顏色空間轉(zhuǎn)換功能

    C# OpenCVSharp實現(xiàn)顏色空間轉(zhuǎn)換功能

    OpenCVSharp 是 OpenCV 的 C# 封裝,允許開發(fā)者在 .NET 環(huán)境下使用 OpenCV 提供的強大計算機視覺和圖像處理功能,它支持大多數(shù) OpenCV 的功能,包括圖像讀取、處理、特征檢測、機器學(xué)習(xí)等,所以本文給大家介紹了C# OpenCVSharp實現(xiàn)顏色空間轉(zhuǎn)換功能,需要的朋友可以參考下
    2025-09-09
  • Unity Shader實現(xiàn)圖形繪制(藍(lán)天白云大海)

    Unity Shader實現(xiàn)圖形繪制(藍(lán)天白云大海)

    這篇文章主要為大家詳細(xì)介紹了Unity Shader實現(xiàn)圖形繪制,藍(lán)天白云大海,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C#中如何把dll打包到exe

    C#中如何把dll打包到exe

    這篇文章主要介紹了C#中如何把dll打包到exe問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • C#實現(xiàn)redis讀寫的方法

    C#實現(xiàn)redis讀寫的方法

    這篇文章主要為大家詳細(xì)介紹了C#實現(xiàn)redis讀寫的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05

最新評論

莱州市| 尚志市| 轮台县| 黎川县| 天柱县| 凌云县| 四平市| 商水县| 景泰县| 惠安县| 连云港市| 云梦县| 策勒县| 霍林郭勒市| 玉树县| 巴塘县| 云龙县| 甘洛县| 沂南县| 沂源县| 永吉县| 三台县| 灌云县| 当雄县| 镶黄旗| 湛江市| 余干县| 米林县| 邳州市| 大冶市| 彰化县| 龙游县| 许昌县| 旌德县| 监利县| 乌兰县| 巴林左旗| 仙游县| 黎平县| 北辰区| 卢龙县|