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

C#中異步是4種實現方式詳解

 更新時間:2024年03月11日 15:10:40   作者:追逐時光者  
這篇文章主要為大家詳細介紹了C#中異步實現方式的相關知識,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以跟隨小編一起學習一下

前言

微信群里的一個提問引發(fā)的這個問題,有同學問:C#異步有多少種實現方式?想要知道C#異步有多少種實現方式,首先我們要知道.NET提供的執(zhí)行異步操作的三種模式,然后再去了解C#異步實現的方式。

.NET異步編程模式

.NET 提供了執(zhí)行異步操作的三種模式:

基于任務的異步模式 (TAP) ,該模式使用單一方法表示異步操作的開始和完成。TAP 是在 .NET Framework 4 中引入的。 這是在 .NET 中進行異步編程的推薦方法。C# 中的 async 和 await 關鍵詞以及 Visual Basic 中的 Async 和 Await 運算符為 TAP 添加了語言支持。有關詳細信息,請參閱基于任務的異步模式 (TAP)。

基于事件的異步模式 (EAP),是提供異步行為的基于事件的舊模型。這種模式需要后綴為 Async 的方法,以及一個或多個事件、事件處理程序委托類型和 EventArg 派生類型。EAP 是在 .NET Framework 2.0 中引入的。建議新開發(fā)中不再使用這種模式。有關詳細信息,請參閱基于事件的異步模式 (EAP)。

異步編程模型 (APM) 模式(也稱為 IAsyncResult 模式),這是使用 IAsyncResult 接口提供異步行為的舊模型。在這種模式下,同步操作需要 Begin 和 End 方法(例如,BeginWrite 和 EndWrite以實現異步寫入操作)。不建議新的開發(fā)使用此模式。有關詳細信息,請參閱異步編程模型 (APM)。

C#異步四種實現方式

1、異步方法(Async Method TAP模式)

使用async/await關鍵字實現異步編程,這是比較常用的一種異步實現方式。例如:

    public async Task TestDoSomeAsync()
    {
        await Task.Delay(1000*10);
        Console.WriteLine("Async method completed.");
    }

2、任務并行庫(TPL, Task Parallel Library TAP模式)

通過 Task 和 Task<T> 類型實現異步編程,可以利用多核處理器,并發(fā)執(zhí)行多個獨立的任務。例如:

 public static void TestTaskParallel()
        {
            var task1 = Task.Run(() =>
            {
                Console.WriteLine("Task 1 completed.");
            });
 
            var task2 = Task.Run(() =>
            {
                Console.WriteLine("Task 2 completed.");
            });
 
            Task<int> task3 = Task.Factory.StartNew(() =>
            {
                Console.WriteLine("Task 3 completed.");
                return 20;// 返回一個整數值
            });
 
            //等待所有任務完成
            Task.WaitAll(task1, task2, task3);
        }

3、Asynchronous Programming Model(APM模式)

是一種經典的異步編程模式,需要手動創(chuàng)建回調函數,用于處理完成或錯誤的通知。可以通過 IAsyncResult 設計模式的 Begin 和 End 方法來實現,其中 Begin 方法開始異步操作,而 End 方法在異步操作完成時執(zhí)行,并返回異步操作的結果。

需要注意的是,APM 模式通過 IAsyncResult 接口來存儲異步操作的狀態(tài)和結果,相對比較復雜,代碼量也較大。同時,在使用 APM 模式時,還需要手動處理回調函數和等待異步操作完成等細節(jié)工作,使得開發(fā)起來相對較為繁瑣。

class Program
    {
        static void Main(string[] args)
        {
            // 創(chuàng)建異步操作類實例
            MyAsyncClass asyncClass = new MyAsyncClass();
 
            // 開始異步操作
            IAsyncResult result = asyncClass.BeginDoWork(null, null);
 
            // 主線程執(zhí)行其他操作
            // 等待異步操作完成并獲取結果
            int res = asyncClass.EndDoWork(result);
 
            // 處理異步操作的結果
            Console.WriteLine("Result: " + res);
 
            Console.ReadLine();
        }
    }
 
    class MyAsyncClass
    {
        /// <summary>
        /// 異步執(zhí)行的方法
        /// </summary>
        /// <param name="callback">callback</param>
        /// <param name="state">state</param>
        /// <returns></returns>
        public IAsyncResult BeginDoWork(AsyncCallback callback, object state)
        {
            // 創(chuàng)建一個新的異步操作對象
            MyAsyncResult result = new MyAsyncResult(state);
 
            // 開始異步操作
            Thread thread = new Thread(() =>
            {
                try
                {
                    // 執(zhí)行一些操作
                    int res = 1 + 2;
 
                    // 設置異步操作的結果
                    result.Result = res;
 
                    // 觸發(fā)回調函數
                    callback?.Invoke(result);
                }
                catch (Exception ex)
                {
                    // 設置異步操作的異常
                    result.Error = ex;
 
                    // 觸發(fā)回調函數
                    callback?.Invoke(result);
                }
 
            });
            thread.Start();
 
            // 返回異步操作對象
            return result;
        }
 
        /// <summary>
        /// 結束異步執(zhí)行的方法
        /// </summary>
        /// <param name="result">result</param>
        /// <returns></returns>
        public int EndDoWork(IAsyncResult result)
        {
            // 將 IAsyncResult 轉換為 MyAsyncResult 類型,并等待異步操作完成
            MyAsyncResult myResult = (MyAsyncResult)result;
            myResult.AsyncWaitHandle.WaitOne();
 
            // 在異步操作中拋出異常
            if (myResult.Error != null)
            {
                throw myResult.Error;
            }
 
            // 返回異步操作的結果
            return myResult.Result;
        }
    }
 
    class MyAsyncResult : IAsyncResult
    {
        public bool IsCompleted => AsyncWaitHandle.WaitOne(0);
        public WaitHandle AsyncWaitHandle { get; } = new ManualResetEvent(false);
        public object AsyncState { get; }
        public bool CompletedSynchronously => false;
 
        public int Result { get; set; }
 
        /// <summary>
        /// 存儲異步操作的結果或異常信息
        /// </summary>
        public Exception Error { get; set; }
 
        /// <summary>
        /// 構造函數
        /// </summary>
        /// <param name="asyncState">asyncState</param>
        public MyAsyncResult(object asyncState)
        {
            AsyncState = asyncState;
        }
    }

4、Event-based Asynchronous Pattern(EAP模式)

一種已過時的異步編程模式,需要使用事件來實現異步編程。例如:

需要注意的是,EAP 模式通過事件來實現異步編程,相對于 APM 模式更加簡潔易懂,同時也避免了手動處理回調函數等細節(jié)工作。但是,EAP 模式并不支持 async/await 異步關鍵字,因此在一些特定的場景下可能不夠靈活。

public class MyAsyncClass : Component
    {
        /// <summary>
        /// 聲明一個委托類型,用于定義異步操作的方法簽名
        /// </summary>
        /// <param name="arg"></param>
        /// <returns></returns>
        public delegate int MyAsyncDelegate(int arg);
 
        /// <summary>
        /// 聲明一個事件,用于通知異步操作的完成
        /// </summary>
        public event MyAsyncDelegate OperationNameCompleted;
 
        /// <summary>
        /// 異步執(zhí)行方法,接受一個參數 arg
        /// </summary>
        /// <param name="arg"></param>
        public void DoWorkAsync(int arg)
        {
            // 將異步操作放入線程池中執(zhí)行
            ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork), arg);
        }
 
        /// <summary>
        /// 真正的異步操作
        /// </summary>
        /// <param name="obj"></param>
        private void DoWork(object obj)
        {
            int arg = (int)obj;
            int res = arg + 1;
 
            // 觸發(fā)事件,傳遞異步操作的結果
            OperationNameCompleted?.Invoke(res);
        }
    }

使用總結   

綜合上面三種執(zhí)行異步操作的模式而言,得出以下結論:TAP適合簡單的并行場景,EAP更適合清晰的控制有來有往的多端異步場景,APM更適合控制求解復雜結構的返回值的場景。各有各種方便的地方,也各有表達困難的地方,有的方法看著麻煩,但是思路清晰,便于調試。有的辦法看似簡單,結合交互通信就讓人費解。不是說新的就一定好,合適的方法才是最好的。

到此這篇關于C#中異步是4種實現方式詳解的文章就介紹到這了,更多相關C#異步內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 輕松學習C#的ArrayList類

    輕松學習C#的ArrayList類

    輕松學習C#的ArrayList類,對C#的ArrayList類感興趣的朋友可以參考本篇文章,幫助大家更靈活的運用C#的ArrayList類
    2015-11-11
  • C#9.0 新特性簡介

    C#9.0 新特性簡介

    這篇文章主要介紹了C#9.0 新特性簡介,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • C#使用HttpClient的正確方式你了解嗎

    C#使用HttpClient的正確方式你了解嗎

    在微服務架構體系中經常需要向特定?URL?地址發(fā)送?Http?請求操作,在?.net?core?中?httpClient?使用不當會造成災難性的問題,這篇文章主要來分享?.net?core?中通過?IHttpClientFactory?工廠來使用?HttpClient?的正確打開方式
    2021-11-11
  • C#(Winfrom)自定義控件--組合控件方式

    C#(Winfrom)自定義控件--組合控件方式

    文章介紹了創(chuàng)建和使用自定義控件的步驟:首先構建控件庫項目,添加TextBox和Button控件并設置透明背景,編寫屬性及事件處理代碼;然后通過測試程序驗證功能,最后將控件部署到測試窗體中使用
    2025-07-07
  • C#.NET ObjectPool 對象復用、池化策略與使用邊界

    C#.NET ObjectPool 對象復用、池化策略與使用邊界

    本文主要介紹了C#.NET ObjectPool 對象復用、池化策略與使用邊界,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2026-06-06
  • C#實現向多線程傳參的三種方式實例分析

    C#實現向多線程傳參的三種方式實例分析

    這篇文章主要介紹了C#實現向多線程傳參的三種方式,以實例形式較為詳細的分析了C#多線程及參數傳遞的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • Winform 實現進度條彈窗和任務控制

    Winform 實現進度條彈窗和任務控制

    這篇文章主要介紹了Winform 實現進度條彈窗和任務控制的方法,幫助大家更好的利用c# winform進行開發(fā),感興趣的朋友可以了解下
    2020-12-12
  • 詳解c# 類的構造方法

    詳解c# 類的構造方法

    本文主要介紹了c#類的構造方法。具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • C#驗證碼問題的快速解決方法

    C#驗證碼問題的快速解決方法

    下面小編就為大家?guī)硪黄狢#驗證碼問題的快速解決方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07
  • C# Volatile的具體使用

    C# Volatile的具體使用

    本文主要介紹了C# Volatile的具體使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11

最新評論

彭州市| 太仆寺旗| 四平市| 内江市| 鄱阳县| 沈丘县| 鄯善县| 鄂伦春自治旗| 南陵县| 丽江市| 封开县| 巨野县| 临安市| 股票| 日土县| 上饶市| 平乡县| 米易县| 丰城市| 大荔县| 宁波市| 贵南县| 潜山县| 梁平县| 伊金霍洛旗| 正镶白旗| 门头沟区| 韶山市| 乌拉特中旗| 色达县| 久治县| 崇礼县| 潞城市| 嘉善县| 浦北县| 武胜县| 西乡县| 贞丰县| 江达县| 永济市| 巩留县|