1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      awaitforeach怎么在C#8.0中使用-創(chuàng)新互聯(lián)

      今天就跟大家聊聊有關(guān)await foreach怎么在C# 8.0中使用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

      成都創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計與策劃設(shè)計,玉林網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:玉林等地區(qū)。玉林做網(wǎng)站價格咨詢:18980820575
      static int SumFromOneToCount(int count)
          {
            ConsoleExt.WriteLine("SumFromOneToCount called!");
      
            var sum = 0;
            for (var i = 0; i <= count; i++)
            {
              sum = sum + i;
            }
            return sum;
          }

      調(diào)用方法.

      static void Main(string[] args)
          {
            const int count = 5;
            ConsoleExt.WriteLine($"Starting the application with count: {count}!");
            ConsoleExt.WriteLine("Classic sum starting.");
            ConsoleExt.WriteLine($"Classic sum result: {SumFromOneToCount(count)}");
            ConsoleExt.WriteLine("Classic sum completed.");
            ConsoleExt.WriteLine("################################################");
          }

      輸出結(jié)果.

      await foreach怎么在C# 8.0中使用

      可以看到,整個過程就一個線程Id為1的線程自上而下執(zhí)行,這是最基礎(chǔ)的做法.

      Yield Return

      接下來,我們使用yield運算符使得這個方法編程延遲加載,如下所示.

      static IEnumerable SumFromOneToCountYield(int count)
          {
            ConsoleExt.WriteLine("SumFromOneToCountYield called!");
      
            var sum = 0;
            for (var i = 0; i <= count; i++)
            {
              sum = sum + i;
      
              yield return sum;
            }
          }

      主函數(shù)

      static void Main(string[] args)
          {
            const int count = 5;
            ConsoleExt.WriteLine("Sum with yield starting.");
            foreach (var i in SumFromOneToCountYield(count))
            {
              ConsoleExt.WriteLine($"Yield sum: {i}");
            }
            ConsoleExt.WriteLine("Sum with yield completed.");
      
            ConsoleExt.WriteLine("################################################");
            ConsoleExt.WriteLine(Environment.NewLine);
          }

      運行結(jié)果如下.

      await foreach怎么在C# 8.0中使用

      正如你在輸出窗口中看到的那樣,結(jié)果被分成幾個部分返回,而不是作為一個值返回。以上顯示的累積結(jié)果被稱為惰性枚舉。但是,仍然存在一個問題,即 sum 方法阻塞了代碼的執(zhí)行。如果你查看線程ID,可以看到所有東西都在主線程1中運行,這顯然不完美,繼續(xù)改造.

      Async Return

      我們試著將async用于SumFromOneToCount方法(沒有yield關(guān)鍵字).

      static async Task SumFromOneToCountAsync(int count)
          {
            ConsoleExt.WriteLine("SumFromOneToCountAsync called!");
      
            var result = await Task.Run(() =>
            {
              var sum = 0;
      
              for (var i = 0; i <= count; i++)
              {
                sum = sum + i;
              }
              return sum;
            });
      
            return result;
          }

      主函數(shù).

      static async Task Main(string[] args)
          {
            const int count = 5;
            ConsoleExt.WriteLine("async example starting.");
            // Sum runs asynchronously! Not enough. We need sum to be async with lazy behavior.
            var result = await SumFromOneToCountAsync(count);
            ConsoleExt.WriteLine("async Result: " + result);
            ConsoleExt.WriteLine("async completed.");
      
            ConsoleExt.WriteLine("################################################");
            ConsoleExt.WriteLine(Environment.NewLine);
          }

      運行結(jié)果.

      await foreach怎么在C# 8.0中使用

      我們可以看到計算過程是在另一個線程中運行,但結(jié)果仍然是作為一個值返回!任然不完美.

      如果我們想把惰性枚舉(yield return)與異步方法結(jié)合起來,即返回Task

      Task

      我們根據(jù)假設(shè)把代碼改造一遍,使用Task>來進行計算.

      await foreach怎么在C# 8.0中使用

      可以看到,直接出現(xiàn)錯誤.

      IAsyncEnumerable

      其實,在C# 8.0中Task這種組合稱為IAsyncEnumerable。這個新功能為我們提供了一種很好的技術(shù)來解決拉異步延遲加載的問題,例如從網(wǎng)站下載數(shù)據(jù)或從文件或數(shù)據(jù)庫中讀取記錄,與 IEnumerable 和 IEnumerator 類似,Async Streams 提供了兩個新接口 IAsyncEnumerable 和 IAsyncEnumerator,定義如下:

      public interface IAsyncEnumerable
        {
          IAsyncEnumerator GetAsyncEnumerator();
        }
      
        public interface IAsyncEnumerator : IAsyncDisposable
        {
          Task MoveNextAsync();
          T Current { get; }
        }
      
        // Async Streams Feature 可以被異步銷毀 
        public interface IAsyncDisposable
        {
         Task DiskposeAsync();
        }

      AsyncStream

      下面,我們就來見識一下AsyncStrema的威力,我們使用IAsyncEnumerable來對函數(shù)進行改造,如下.

      static async Task ConsumeAsyncSumSeqeunc(IAsyncEnumerable sequence)
          {
            ConsoleExt.WriteLineAsync("ConsumeAsyncSumSeqeunc Called");
      
            await foreach (var value in sequence)
            {
              ConsoleExt.WriteLineAsync($"Consuming the value: {value}");
      
              // simulate some delay!
              await Task.Delay(TimeSpan.FromSeconds(1));
            };
          }
      
          private static async IAsyncEnumerable ProduceAsyncSumSeqeunc(int count)
          {
            ConsoleExt.WriteLineAsync("ProduceAsyncSumSeqeunc Called");
            var sum = 0;
      
            for (var i = 0; i <= count; i++)
            {
              sum = sum + i;
      
              // simulate some delay!
              await Task.Delay(TimeSpan.FromSeconds(0.5));
      
              yield return sum;
            }
          }

      主函數(shù).

       static async Task Main(string[] args)
          {
            const int count = 5;
            ConsoleExt.WriteLine("Starting Async Streams Demo!");
      
            // Start a new task. Used to produce async sequence of data!
            IAsyncEnumerable pullBasedAsyncSequence = ProduceAsyncSumSeqeunc(count);
      
            // Start another task; Used to consume the async data sequence!
            var consumingTask = Task.Run(() => ConsumeAsyncSumSeqeunc(pullBasedAsyncSequence));
      
            await Task.Delay(TimeSpan.FromSeconds(3));
      
            ConsoleExt.WriteLineAsync("X#X#X#X#X#X#X#X#X#X# Doing some other work X#X#X#X#X#X#X#X#X#X#");
      
            // Just for demo! Wait until the task is finished!
            await consumingTask;
      
            ConsoleExt.WriteLineAsync("Async Streams Demo Done!");
          }

      如果一切順利,那么就能看到這樣的運行結(jié)果了.

      await foreach怎么在C# 8.0中使用

      最后,看到這就是我們想要的結(jié)果,在枚舉的基礎(chǔ)上,進行了異步迭代.

      可以看到,整個計算過程并沒有造成主線程的阻塞,其中,值得重點關(guān)注的是紅色方框區(qū)域的線程5!線程5!線程5!線程5在請求下一個結(jié)果后,并沒有等待結(jié)果返回,而是去了Main()函數(shù)中做了別的事情,等待請求的結(jié)果返回后,線程5又接著執(zhí)行foreach中任務(wù).

      Client/Server的異步拉取

      如果還沒有理解Async Streams的好處,那么我借助客戶端 / 服務(wù)器端架構(gòu)是演示這一功能優(yōu)勢的絕佳方法。

      同步調(diào)用

      客戶端向服務(wù)器端發(fā)送請求,客戶端必須等待(客戶端被阻塞),直到服務(wù)器端做出響應(yīng).

      await foreach怎么在C# 8.0中使用

      示例中Yield Return就是以這種方式執(zhí)行的,所以整個過程只有一個線程即線程1在處理.

      異步調(diào)用

      客戶端發(fā)出數(shù)據(jù)塊請求,然后繼續(xù)執(zhí)行其他操作。一旦數(shù)據(jù)塊到達,客戶端就處理接收到的數(shù)據(jù)塊并詢問下一個數(shù)據(jù)塊,依此類推,直到達到最后一個數(shù)據(jù)塊為止。這正是 Async Streams 想法的來源。

      await foreach怎么在C# 8.0中使用

      最后一個示例就是以這種方式執(zhí)行的,線程5詢問下一個數(shù)據(jù)后并沒有等待結(jié)果返回,而是去做了Main()函數(shù)中的別的事情,數(shù)據(jù)到達后,線程5又繼續(xù)處理foreach中的任務(wù).

      Tips

      如果你使用的是.net core 2.2及以下版本,會遇到這樣的報錯.

      await foreach怎么在C# 8.0中使用

      需要安裝.net core 3.0 preview的SDK(截至至博客撰寫日期4月9日,.net core SDK最新版本為3.0.100-preview3-010431),安裝好SDK后,如果你是VS 2019正式版,可能無法選擇3.0的與預(yù)覽版,聽過只有VS 2019 Preview才支持.Net core 3.0的預(yù)覽版.

      await foreach怎么在C# 8.0中使用

      看完上述內(nèi)容,你們對await foreach怎么在C# 8.0中使用有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計公司行業(yè)資訊頻道,感謝大家的支持。

      另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。


      網(wǎng)站題目:awaitforeach怎么在C#8.0中使用-創(chuàng)新互聯(lián)
      文章源于:http://www.ef60e0e.cn/article/jppjg.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        申扎县| 鹤庆县| 垣曲县| 马公市| 贵定县| 海兴县| 鸡西市| 抚远县| 怀来县| 大关县| 革吉县| 理塘县| 固安县| 启东市| 岫岩| 威海市| 灌南县| 上高县| 禹城市| 佳木斯市| 兴山县| 句容市| 辉南县| 化州市| 横峰县| 堆龙德庆县| 三穗县| 山西省| 新昌县| 龙口市| 凌源市| 华亭县| 扎兰屯市| 乐亭县| 杨浦区| 吉安县| 霍林郭勒市| 濉溪县| 凉城县| 文成县| 社会|