公交车上荫蒂添的好舒服的电影-公用玩物(np双xing总受)-公用小荡货芊芊-公与妇仑乱hd-攻把受做哭边走边肉楼梯play-古装一级淫片a免费播放口

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

.NET 4.0下實(shí)現(xiàn).NET4.5的Task類相似功能組件 TaskExCum 組件詳解

freeflydom
2024年11月6日 9:24 本文熱度 1312

引言

隨著 .NET 技術(shù)的發(fā)展,異步編程模型逐漸成為現(xiàn)代應(yīng)用程序開發(fā)中的標(biāo)準(zhǔn)實(shí)踐之一。.NET 4.5 引入了 Task 類,極大地簡化了異步編程的過程。然而,許多遺留系統(tǒng)仍在使用 .NET 4.0 或更低版本,這些版本并未直接支持 Task 類的全部功能。為此,我們開發(fā)了 TaskExCum 組件,旨在為 .NET 4.0 提供與 .NET 4.5 相似的 Task 功能,包括 Task.Run() 和 Task.WhenAll() 方法。

組件概述

TaskExCum 是一個(gè)靜態(tài)類,提供了以下主要功能:

  • Run 方法:用于異步執(zhí)行任務(wù),并獲取任務(wù)的結(jié)果。

  • WhenAll 方法:用于等待多個(gè)任務(wù)完成,并收集所有任務(wù)的結(jié)果。

實(shí)現(xiàn)步驟

接下來,我們將詳細(xì)講解 TaskExCum 組件的實(shí)現(xiàn)步驟,以便讀者能夠更好地理解其工作原理,并將其應(yīng)用于自己的項(xiàng)目中。

步驟 1: 創(chuàng)建 TaskExCum 類

首先,我們需要?jiǎng)?chuàng)建一個(gè)靜態(tài)類 TaskExCum,并在其中定義靜態(tài)方法。

public static class TaskExCum{
    // 方法定義將在后續(xù)步驟中添加}

步驟 2: 實(shí)現(xiàn) Run 方法

Run 方法允許開發(fā)者異步執(zhí)行任務(wù),并獲取任務(wù)的結(jié)果。我們?yōu)?nbsp;Run 方法提供了兩種重載形式,分別用于執(zhí)行無返回值的操作(Action)和有返回值的操作(Func<TResult>)。

public static Task<TResult> Run<TResult>(Func<TResult> function){#if NET45
    // 如果目標(biāo)框架是 .NET 4.5 或更高版本,使用 Task.Run 方法
    return Task.Run(function);#else
    // 如果目標(biāo)框架是 .NET 4.0,使用 Task.Factory.StartNew 方法
    return Task.Factory.StartNew(
        function, 
        CancellationToken.None, 
        TaskCreationOptions.None, 
        TaskScheduler.Default
    );#endif}public static Task Run(Action action){#if NET45
    // 如果目標(biāo)框架是 .NET 4.5 或更高版本,使用 Task.Run 方法
    return Task.Run(action);#else
    // 如果目標(biāo)框架是 .NET 4.0,使用 Task.Factory.StartNew 方法
    return Task.Factory.StartNew(
        action, 
        CancellationToken.None, 
        TaskCreationOptions.None, 
        TaskScheduler.Default
    );#endif}

詳細(xì)解釋

  • 條件編譯:使用 #if NET45 編譯符號(hào),當(dāng)項(xiàng)目目標(biāo)框架為 .NET 4.5 及更高版本時(shí),使用 Task.Run 方法。

  • Task.Factory.StartNew:當(dāng)項(xiàng)目目標(biāo)框架為 .NET 4.0 時(shí),使用 Task.Factory.StartNew 方法來啟動(dòng)任務(wù)。

    • CancellationToken.None:表示沒有取消令牌,任務(wù)不會(huì)被外部取消。

    • TaskCreationOptions.None:表示沒有特殊的任務(wù)創(chuàng)建選項(xiàng)。

    • TaskScheduler.Default:這是關(guān)鍵點(diǎn)之一。TaskScheduler.Default 表示使用默認(rèn)的線程池調(diào)度器,這意味著任務(wù)會(huì)在線程池中的一個(gè)線程上執(zhí)行,而不是每次都啟動(dòng)一個(gè)新的線程。這有助于提高性能和資源利用率。

步驟 3: 實(shí)現(xiàn) WhenAll 方法

WhenAll 方法用于等待多個(gè)任務(wù)完成,并收集所有任務(wù)的結(jié)果。我們?yōu)?nbsp;WhenAll 方法提供了多種重載形式,以支持不同類型的任務(wù)集合。

public static Task<TResult[]> WhenAll<TResult>(IEnumerable<Task<TResult>> tasks){#if NET45
    // 如果目標(biāo)框架是 .NET 4.5 或更高版本,使用 Task.WhenAll 方法
    return Task.WhenAll(tasks);#else
    // 如果目標(biāo)框架是 .NET 4.0,調(diào)用 WhenAllCore 方法
    return WhenAllCore(tasks);#endif}public static Task<TResult[]> WhenAll<TResult>(params Task<TResult>[] tasks){#if NET45
    // 如果目標(biāo)框架是 .NET 4.5 或更高版本,使用 Task.WhenAll 方法
    return Task.WhenAll(tasks);#else
    // 如果目標(biāo)框架是 .NET 4.0,調(diào)用 WhenAllCore 方法
    return WhenAllCore(tasks);#endif}public static Task WhenAll(IEnumerable<Task> tasks){#if NET45
    // 如果目標(biāo)框架是 .NET 4.5 或更高版本,使用 Task.WhenAll 方法
    return Task.WhenAll(tasks);#else
    // 如果目標(biāo)框架是 .NET 4.0,調(diào)用 WhenAllCore 方法
    return WhenAllCore(tasks);#endif}

詳細(xì)解釋

  • 條件編譯:使用 #if NET45 編譯符號(hào),當(dāng)項(xiàng)目目標(biāo)框架為 .NET 4.5 及更高版本時(shí),使用 Task.WhenAll 方法。

  • WhenAllCore:當(dāng)項(xiàng)目目標(biāo)框架為 .NET 4.0 時(shí),調(diào)用 WhenAllCore 方法來實(shí)現(xiàn)相同的功能。

步驟 4: 實(shí)現(xiàn) WhenAllCore 方法

WhenAllCore 方法是 WhenAll 方法的核心實(shí)現(xiàn),負(fù)責(zé)處理任務(wù)集合,等待所有任務(wù)完成,并收集結(jié)果或異常信息。

private static Task WhenAllCore(IEnumerable<Task> tasks){
    return WhenAllCore(tasks, (completedTasks, tcs) => tcs.TrySetResult(null));
}private static Task<TResult[]> WhenAllCore<TResult>(IEnumerable<Task<TResult>> tasks){
    return WhenAllCore(tasks.Cast<Task>(), (completedTasks, tcs) =>
    {
        tcs.TrySetResult(completedTasks.Select(t => ((Task<TResult>)t).Result).ToArray());
    });
}private static Task<TResult> WhenAllCore<TResult>(IEnumerable<Task> tasks, Action<Task[], TaskCompletionSource<TResult>> setResultAction){
    if (tasks == null)
    {
        throw new ArgumentNullException("tasks");
    }
    Contract.EndContractBlock();
    Contract.Assert(setResultAction != null);
    var tcs = new TaskCompletionSource<TResult>();
    var array = (tasks as Task[]) ?? tasks.ToArray();
    if (array.Length == 0)
    {
        // 如果任務(wù)集合為空,直接設(shè)置結(jié)果
        setResultAction(array, tcs);
    }
    else
    {
        Task.Factory.ContinueWhenAll(array, completedTasks =>
        {
            var exceptions = new List<Exception>();
            bool hasCanceled = false;
            foreach (var task in completedTasks)
            {
                if (task.IsFaulted)
                {
                    // 收集所有失敗任務(wù)的異常信息
                    exceptions.AddRange(task.Exception.InnerExceptions);
                }
                else if (task.IsCanceled)
                {
                    // 檢查是否有任務(wù)被取消
                    hasCanceled = true;
                }
            }
            if (exceptions.Count > 0)
            {
                // 如果有異常,設(shè)置異常結(jié)果
                tcs.TrySetException(exceptions);
            }
            else if (hasCanceled)
            {
                // 如果有任務(wù)被取消,設(shè)置取消結(jié)果
                tcs.TrySetCanceled();
            }
            else
            {
                // 如果沒有異常且沒有任務(wù)被取消,設(shè)置成功結(jié)果
                setResultAction(completedTasks, tcs);
            }
        }, CancellationToken.None, TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default);
    }
    return tcs.Task;
}

詳細(xì)解釋

  • 參數(shù)驗(yàn)證:檢查傳入的任務(wù)集合是否為 null,如果是,則拋出 ArgumentNullException。

  • TaskCompletionSource:創(chuàng)建一個(gè) TaskCompletionSource 對(duì)象,用于管理任務(wù)的完成狀態(tài)。

  • 任務(wù)轉(zhuǎn)換:將任務(wù)集合轉(zhuǎn)換為數(shù)組,以便于后續(xù)處理。

  • 任務(wù)數(shù)量檢查:如果任務(wù)集合為空,直接調(diào)用 setResultAction 設(shè)置結(jié)果。

  • 等待所有任務(wù)完成:使用 Task.Factory.ContinueWhenAll 方法等待所有任務(wù)完成。

    • 異常處理:遍歷已完成的任務(wù),收集所有失敗任務(wù)的異常信息。

    • 取消處理:檢查是否有任務(wù)被取消。

    • 設(shè)置結(jié)果:如果沒有異常且沒有任務(wù)被取消,調(diào)用 setResultAction 設(shè)置結(jié)果。

    • TaskScheduler.Default:這里再次使用 TaskScheduler.Default,確保任務(wù)在默認(rèn)的線程池中執(zhí)行,而不是每次都啟動(dòng)新的線程。

步驟 5: 添加異常處理邏輯

為了確保組件的健壯性,我們還需要在 WhenAllCore 方法中添加異常處理邏輯,確保所有異常都能被捕獲并正確處理。

private static void AddPotentiallyUnwrappedExceptions(ref List<Exception> targetList, Exception exception){
    var ex = exception as AggregateException;
    Contract.Assert(exception != null);
    Contract.Assert(ex == null || ex.InnerExceptions.Count > 0);
    if (targetList == null)
    {
        targetList = new List<Exception>();
    }
    if (ex != null)
    {
        // 如果異常是 AggregateException,添加其內(nèi)部異常
        targetList.Add(ex.InnerExceptions.Count == 1 ? ex.InnerExceptions[0] : ex);
    }
    else
    {
        // 否則,直接添加異常
        targetList.Add(exception);
    }
}

詳細(xì)解釋

  • 異常類型檢查:檢查傳入的異常是否為 AggregateException

  • 異常列表初始化:如果 targetList 為 null,則初始化一個(gè)新的列表。

  • 異常添加:根據(jù)異常的類型,將異常或其內(nèi)部異常添加到列表中。

示例代碼

為了幫助讀者更好地理解如何使用 TaskExCum 組件,下面是一些示例代碼。

示例 1: 使用 Run 方法

using System;using System.Threading.Tasks;class Program{
    static void Main(string[] args)
    {
        try
        {
            // 異步執(zhí)行任務(wù)并等待結(jié)果
            string result = TaskExCum.Run(() => "Hello from Task!").Result;
            Console.WriteLine(result);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }
    }
}

示例 2: 使用 WhenAll 方法

using System;using System.Linq;using System.Threading.Tasks;class Program{
    static void Main(string[] args)
    {
        try
        {
            // 創(chuàng)建多個(gè)任務(wù)
            var tasks = Enumerable.Range(1, 5).Select(i => TaskExCum.Run(() => i * i)).ToArray();
            
            // 等待所有任務(wù)完成并獲取結(jié)果
            int[] results = TaskExCum.WhenAll(tasks).Result;
            
            // 輸出結(jié)果
            foreach (var result in results)
            {
                Console.WriteLine(result);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }
    }
}

轉(zhuǎn)自https://www.cnblogs.com/Bob-luo/p/18515670


該文章在 2024/11/6 9:24:43 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲(chǔ)管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 国产巨大爆乳在线观看 | 国产高清亚洲日韩一区 | 国产爆乳无码视频在线观看 | av色蜜桃一区二区三区 | 精品亚洲欧美高清不卡高清 | 高清日韩热门电影免费手机在线观看 | 国产成人精品无码播放 | 国产高清a毛片在线看 | 国产日韩亚洲三级片在线观 | 成人做爰视频www | 2025国产精品永久在线 | av巨作精品原创 | 国产在线精品二期不卡 | 国产一区二区三区福利 | 国产成人免费观看 | 国产精品无码一区二区三区在 | 91久久婷婷国产麻豆精品电影 | av每日更新手机观看 | 国产精品无码dvd在线观看 | 大尺度毛片免费看 | 国产精品免费aⅴ片在线观看 | 成人欧美一区二区三区在线观看 | 精品无人区无码乱 | 国精产品一品二品国在线 | 国产一级片内射 | 国产精品一区二555 国产精品一区二区 | 国产精品日韩一区二区三区 | 18禁裸体动漫美女无遮挡网站 | 精品欧洲av无码一区二区男男 | 国产二级一片内射视频插放 | 国产一级毛片特级毛片国产 | 国产91在线播放中文 | 国产在线第一浮力影院 | 国产成人欧美综合在线影院 | 国产成人精品一区二区三区影院 | 国产在线不卡一区 | 国产在线高清伦免费理视频 | 国产高潮抽搐翻白眼在线播放 | 国产高清视频一区二区在 | 国产成人毛片基地 | 高清不卡一区二区三区 |