亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C#異步迭代IAsyncEnumerable應用實現(xiàn)

 更新時間:2021年06月28日 10:42:09   作者:魯廣廣  
IAsyncEnumerable可以來實現(xiàn)異步迭代,本文就主要介紹了C#異步迭代IAsyncEnumerable應用實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下

最近用WPF做金稅盤開發(fā)中有這樣一個需求,批量開票每次開票都需要連接一次金稅盤。

比如我有發(fā)票 a, b ,c ,d e 這五張發(fā)票,每次開具發(fā)票都需要調(diào)用金稅盤底層,才能正常開票。

首先,嘗試寫第一個方法

private  void Button_Click(object sender, RoutedEventArgs e)
        {
            var dateStart = DateTime.Now;  //記錄用時的起始時間
            DebugText = string.Empty;
            List<string> fpList = new List<string>() { "a", "b", "c", "d" };

            foreach (var item in MockIO)
            {
                var dateEnd = DateTime.Now;
                var timeSpan = dateEnd - dateStart;//記錄開票用時
                DebugText += item + " " + timeSpan.TotalSeconds + "\r\n";

            }
        }

     /// <summary>
        /// 批量開票方法
        /// </summary>
        /// <param name="ls"></param>
        /// <returns></returns>
        public static IEnumerable<string> MockIO(List<string> ls)
        {

            foreach (var item in ls)
            {
                Task.Delay(1000).Wait();
                yield return item;
                Debug.WriteLine(Thread.GetCurrentProcessorId());
            }
        }

來看效果

很明顯,發(fā)生了UI阻塞情況。因為我們并未對代碼做任何異步處理。接下來,我們開始嘗試修改。

首先,我們嘗試按照常規(guī)異步方法修改 MockIO 函數(shù),增加 async 關鍵詞,返回結(jié)果增加 Task, 內(nèi)部對IO操作添加 await。

修改完畢后,編譯并沒有通過,VS對該方法報異常

通過提示信息,我們可以發(fā)現(xiàn),返回值 Task<IEnumerable<string>> 并不是可以迭代的,因為我們采用了 yield 來返回值,所以我們需要一個可以迭代的返回值。

比如改成這樣

但是,這樣一次就返回一組 Task ,沒有用到方便的 yield;

此時,就可以用到 IAsyncEnumerable 來設計了,IAsyncEnumerable是C# 8.0引入的新特性,在異步迭代中,非常方便。如上述代碼,可以直接修改為

public static async IAsyncEnumerable<string> MockIOAsync(List<string> ls)
        {
            foreach (var item in ls)
            {
                Task<Task<string>> task = Task<Task<string>>.Factory.StartNew(async () =>
               {
                   await Task.Delay(1000);
                   return item;

               });

                yield return await task.Result;
            }
        }

我們再運行調(diào)試,看一下效果

我們可以看到,不僅UI沒有被阻塞,同時,傳回的值也是一個接一個的傳過來的,符合我們的預期。

擴展:雖然上述步驟我們完成的UI的非阻塞的實現(xiàn),但是我們整個開票用時并沒有節(jié)省。

接下來,我將繼續(xù)修改 MockIOAsync 方法,將實現(xiàn)迭代器內(nèi)部的多線程操作。

修改后的代碼如下

public static async Task<IEnumerable<string>> MockIOPerformanceAsync(List<string> ls)
        {
            List<string> lss = new List<string>();
            List<Task> tasks = new List<Task>();
            foreach (var item in ls)
            {

                Task task = new Task(() =>
              {
                  Task.Delay(1000).Wait();
                  Debug.WriteLine(Thread.GetCurrentProcessorId());
                  lss.Add(item);
              });
                tasks.Add(task);
                task.Start();

            }
            foreach (var item in tasks)
            {
                await item;
            }
            return lss;
        }

效果展示:

嗯,速度很快,但是排序亂了,因為此方法在遍歷中新建了線程,list 添加并不保證按照迭代器的順序添加。有得有失。

到此這篇關于C#異步迭代IAsyncEnumerable應用實現(xiàn)的文章就介紹到這了,更多相關C#異步迭代IAsyncEnumerable內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C#實現(xiàn)封裝常用Redis工具類的示例代碼

    C#實現(xiàn)封裝常用Redis工具類的示例代碼

    這篇文章主要為大家詳細介紹了C#實現(xiàn)封裝常用Redis工具類的相關知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-03-03
  • 解析OpenXml?Pptx的邊框虛線轉(zhuǎn)為WPF的邊框虛線問題

    解析OpenXml?Pptx的邊框虛線轉(zhuǎn)為WPF的邊框虛線問題

    這篇文章主要介紹了OpenXml?Pptx的邊框虛線轉(zhuǎn)為WPF的邊框虛線,在文中用PPTX的7種直線,分別設置7種能夠設置的虛線類型,具體實例代碼跟隨小編一起看看吧
    2021-12-12
  • C#提取PDF中指定文本與圖片坐標的示例代碼

    C#提取PDF中指定文本與圖片坐標的示例代碼

    這篇文章主要為大家詳細介紹了如何使用國產(chǎn)PDF庫通過C# 提取PDF中指定文本或圖片的坐標位置(X, Y軸),感興趣的小伙伴可以跟隨小編一起學習一下
    2023-12-12
  • C#在窗體中設計滾動字幕的方法

    C#在窗體中設計滾動字幕的方法

    普通窗體中的文字位置都是固定的,但在一些窗體中需要讓文字動起來,如一些廣告性較強的界面中需要做一些滾動的字幕,所以本文給大家介紹了C#在窗體中設計滾動字幕的方法,需要的朋友可以參考下
    2024-04-04
  • C#與PLC通訊的實現(xiàn)代碼

    C#與PLC通訊的實現(xiàn)代碼

    這篇文章主要介紹了C#與PLC通訊的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • C#中for循環(huán)、while循環(huán)循環(huán)執(zhí)行的方法

    C#中for循環(huán)、while循環(huán)循環(huán)執(zhí)行的方法

    這篇文章主要介紹了C#中for循環(huán)、while循環(huán)循環(huán)執(zhí)行的方法的相關資料,非常不錯,具有參考借鑒價值,感興趣的朋友一起學習吧
    2016-06-06
  • C#小數(shù)點格式化用法小結(jié)

    C#小數(shù)點格式化用法小結(jié)

    這篇文章主要介紹了C#小數(shù)點格式化用法,結(jié)合實例形式分析了C#小數(shù)點格式化運算的常用函數(shù)與相關使用技巧,需要的朋友可以參考下
    2016-08-08
  • 用幾行C#代碼實現(xiàn)定時關機/重啟(超詳細!建議新手練習)

    用幾行C#代碼實現(xiàn)定時關機/重啟(超詳細!建議新手練習)

    有很多的軟件都實現(xiàn)了自動關機這樣的功能,下面這篇文章主要給大家介紹了關于利用幾行C#代碼實現(xiàn)定時關機/重啟的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-12-12
  • C#完成word文檔打印的方法

    C#完成word文檔打印的方法

    在日常工作中,我們可能常常需要打印各種文件資料,比如word文檔。對于編程員,應用程序中文檔的打印是一項非常重要的功能,也一直是一個非常復雜的工。這篇文章主要介紹了C#完成word文檔打印的方法,需要的朋友可以參考下
    2016-10-10
  • C#用委托BeginInvoke做異步線程

    C#用委托BeginInvoke做異步線程

    今天小編就為大家分享一篇關于C#用委托BeginInvoke做異步線程,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01

最新評論