中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#中異步迭代IAsyncEnumerable應用的實現方法

發布時間:2021-06-28 11:46:27 來源:億速云 閱讀:578 作者:小新 欄目:開發技術

小編給大家分享一下C#中異步迭代IAsyncEnumerable應用的實現方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

首先,嘗試寫第一個方法

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());
            }
        }

來看效果

C#中異步迭代IAsyncEnumerable應用的實現方法

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

首先,我們嘗試按照常規異步方法修改 MockIO 函數,增加 async 關鍵詞,返回結果增加 Task, 內部對IO操作添加 await。

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

C#中異步迭代IAsyncEnumerable應用的實現方法

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

比如改成這樣

C#中異步迭代IAsyncEnumerable應用的實現方法

但是,這樣一次就返回一組 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;
            }
        }

我們再運行調試,看一下效果

C#中異步迭代IAsyncEnumerable應用的實現方法

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

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

接下來,我將繼續修改 MockIOAsync 方法,將實現迭代器內部的多線程操作。

修改后的代碼如下

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;
        }

效果展示:

C#中異步迭代IAsyncEnumerable應用的實現方法

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

以上是“C#中異步迭代IAsyncEnumerable應用的實現方法”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

万盛区| 常山县| 梅河口市| 封开县| 成武县| 海口市| 尤溪县| 运城市| 扎鲁特旗| 府谷县| 上高县| 乌兰县| 宣武区| 江北区| 安远县| 鹤山市| 洛川县| 南皮县| 民权县| 乡城县| 邯郸市| 古交市| 涞水县| 建德市| 德安县| 太仓市| 双辽市| 北京市| 定西市| 白朗县| 万宁市| 都昌县| 库车县| 定结县| 招远市| 图木舒克市| 江永县| 漠河县| 东丽区| 凤山市| 方正县|