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

C#實現(xiàn)異步的常用方式總結(jié)

 更新時間:2023年05月09日 08:34:45   作者:追逐時光者  
這篇文章主要為大家詳細(xì)介紹了C#實現(xiàn)異步的幾個常用方式,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解一下

前言

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

.NET異步編程模式

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

  • 基于任務(wù)的異步模式 (TAP) ,該模式使用單一方法表示異步操作的開始和完成。 TAP 是在 .NET Framework 4 中引入的。 這是在 .NET 中進(jìn)行異步編程的推薦方法。 C# 中的 async 和 await 關(guān)鍵詞以及 Visual Basic 中的 Async 和 Await 運算符為 TAP 添加了語言支持。 有關(guān)詳細(xì)信息,請參閱基于任務(wù)的異步模式 (TAP)。
  • 基于事件的異步模式 (EAP),是提供異步行為的基于事件的舊模型。 這種模式需要后綴為 Async 的方法,以及一個或多個事件、事件處理程序委托類型和 EventArg 派生類型。 EAP 是在 .NET Framework 2.0 中引入的。 建議新開發(fā)中不再使用這種模式。 有關(guān)詳細(xì)信息,請參閱基于事件的異步模式 (EAP)。
  • 異步編程模型 (APM) 模式(也稱為 IAsyncResult 模式),這是使用 IAsyncResult 接口提供異步行為的舊模型。 在這種模式下,同步操作需要 Begin 和 End 方法(例如,BeginWrite 和 EndWrite以實現(xiàn)異步寫入操作)。 不建議新的開發(fā)使用此模式。 有關(guān)詳細(xì)信息,請參閱異步編程模型 (APM)。

C#異步有四種實現(xiàn)方式

C# 異步有多種實現(xiàn)方式,可歸納為以下幾類:

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

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

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

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

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

public static async void Main(string[] args)
    {
        await Task.Run(() =>
        {
            Console.WriteLine("Test Task 1 completed.");
        });
        await Task.Run(() =>
        {
            Console.WriteLine("Test Task 2 completed.");
        });
        // 等待所有任務(wù)完成
        Task.WaitAll();
    }

3、Asynchronous Programming Model(APM模式)

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

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

class Program
    {
        static void Main(string[] args)
        {
            // 創(chuàng)建異步操作類實例
            MyAsyncClass asyncClass = new MyAsyncClass();

            // 開始異步操作
            IAsyncResult result = asyncClass.BeginDoWork(null, null);

            // 主線程執(zhí)行其他操作
            // 等待異步操作完成并獲取結(jié)果
            int res = asyncClass.EndDoWork(result);

            // 處理異步操作的結(jié)果
            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;

                    // 設(shè)置異步操作的結(jié)果
                    result.Result = res;

                    // 觸發(fā)回調(diào)函數(shù)
                    callback?.Invoke(result);
                }
                catch (Exception ex)
                {
                    // 設(shè)置異步操作的異常
                    result.Error = ex;

                    // 觸發(fā)回調(diào)函數(shù)
                    callback?.Invoke(result);
                }

            });
            thread.Start();

            // 返回異步操作對象
            return result;
        }

        /// <summary>
        /// 結(jié)束異步執(zhí)行的方法
        /// </summary>
        /// <param name="result">result</param>
        /// <returns></returns>
        public int EndDoWork(IAsyncResult result)
        {
            // 將 IAsyncResult 轉(zhuǎn)換為 MyAsyncResult 類型,并等待異步操作完成
            MyAsyncResult myResult = (MyAsyncResult)result;
            myResult.AsyncWaitHandle.WaitOne();

            // 在異步操作中拋出異常
            if (myResult.Error != null)
            {
                throw myResult.Error;
            }

            // 返回異步操作的結(jié)果
            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>
        /// 存儲異步操作的結(jié)果或異常信息
        /// </summary>
        public Exception Error { get; set; }

        /// <summary>
        /// 構(gòu)造函數(shù)
        /// </summary>
        /// <param name="asyncState">asyncState</param>
        public MyAsyncResult(object asyncState)
        {
            AsyncState = asyncState;
        }
    }

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

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

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

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í)行方法,接受一個參數(shù) 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ā)事件,傳遞異步操作的結(jié)果
            OperationNameCompleted?.Invoke(res);
        }
    }

以上就是C#實現(xiàn)異步的常用方式總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于C#異步的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#解析json文件的實現(xiàn)代碼

    C#解析json文件的實現(xiàn)代碼

    最近需要用c#解析json文件,以前沒用過這個,百度了一下找到了這篇文章感覺不錯,特分享下
    2013-06-06
  • Unity學(xué)習(xí)之FSM有限狀態(tài)機(jī)

    Unity學(xué)習(xí)之FSM有限狀態(tài)機(jī)

    這篇文章主要介紹了Unity學(xué)習(xí)之FSM有限狀態(tài)機(jī),通過詳細(xì)的代碼案例來進(jìn)行解析說明,希望這篇文章對你有所幫助
    2021-06-06
  • C#并行庫Task類介紹

    C#并行庫Task類介紹

    這篇文章介紹了C#并行庫Task類,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C# Oracle批量插入數(shù)據(jù)進(jìn)度條的實現(xiàn)代碼

    C# Oracle批量插入數(shù)據(jù)進(jìn)度條的實現(xiàn)代碼

    這篇文章主要介紹了C# Oracle批量插入數(shù)據(jù)進(jìn)度條的實現(xiàn)代碼,需要的朋友可以參考下
    2018-04-04
  • C#9.0主要特性的一些想法

    C#9.0主要特性的一些想法

    這篇文章主要給大家介紹了關(guān)于C#9.0主要特性的一些想法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 基于C#實現(xiàn)獲取Windows所有窗口句柄

    基于C#實現(xiàn)獲取Windows所有窗口句柄

    在做錄屏或截屏操作時,需要獲取當(dāng)前正在運行中的桌面程序句柄,所以這篇文章主要為大家詳細(xì)介紹了如何使用C#實現(xiàn)獲取Windows所有窗口句柄,需要的可以參考下
    2023-12-12
  • C#實現(xiàn)Stripe支付的方法實踐

    C#實現(xiàn)Stripe支付的方法實踐

    本文主要介紹了C#實現(xiàn)Stripe支付的方法實踐,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • SuperSocket封裝成C#類庫的步驟

    SuperSocket封裝成C#類庫的步驟

    這篇文章主要介紹了SuperSocket封裝成C#類庫的步驟,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2021-01-01
  • 在C#中如何使用ResNet50v2進(jìn)行圖像識別

    在C#中如何使用ResNet50v2進(jìn)行圖像識別

    ONNX?運行時推理可以實現(xiàn)更快的客戶體驗和更低的成本,支持來自深度學(xué)習(xí)框架如?PyTorch和TensorFlow/Keras以及經(jīng)典機(jī)器學(xué)習(xí)庫如?scikit-learn、LightGBM、XGBoost?等的模型,這篇文章主要介紹了在C#中如何使用ResNet50v2進(jìn)行圖像識別,需要的朋友可以參考下
    2024-07-07
  • C#使用ICSharpCode.SharpZipLib.dll進(jìn)行文件的壓縮與解壓功能

    C#使用ICSharpCode.SharpZipLib.dll進(jìn)行文件的壓縮與解壓功能

    這篇文章主要介紹了C#使用ICSharpCode.SharpZipLib.dll進(jìn)行文件的壓縮與解壓功能,需要的朋友可以參考下
    2017-12-12

最新評論

延吉市| 惠安县| 南投县| 神木县| 财经| 花垣县| 庆元县| 灵宝市| 镇康县| 离岛区| 东源县| 西安市| 永吉县| 涟源市| 郸城县| 三门县| 兴仁县| 通辽市| 尼木县| 县级市| 舒城县| 仪征市| 镇江市| 大厂| 调兵山市| 杂多县| 荣昌县| 漠河县| 昌图县| 宣威市| 宜昌市| 永顺县| 温宿县| 陵川县| 墨竹工卡县| 辛集市| 图们市| 定兴县| 乳山市| 武威市| 西昌市|