c⻠Aync streeamsの使用解析


この文章を振り返ります。
  • foreach/yield return/async await文法糖の本質
  • どうやって非同期ストリームを使うか?
  • 追加探索: より有意義な反復効果を作成します。
  • foreach/yield return/async awaitの本質
    NETの誕生当初はIEnumerable、IEnumeratorを通じて反復能力を提供し、前者は列挙可能な性質を備え、後者は列挙可能な方式を表す。
    本当に強いタイプのIEnumerable/IEnumeratorを使って、エニュメレート・タイプを作ると、細かいコードがたくさん書かれていることが分かります。
    C((zhi)で発売されたyield returnローズマリーのシンタックスキャンディーは、列挙可能なタイプの作成過程を簡略化しました。コンパイラは、yield returnを状態マシンコードに変換してIEnumerable、IEnumeratorを実現します。
    yieldキーワードは状態反復を実行し、一つ一つエニュメレート・エレメントを返します。データを返す時、一時的なセットを作成してデータを格納する必要はありません。
    C((zhi foreach文法飴)は、列挙可能なタイプの消費を簡略化したものです。コンパイラがforeachを強タイプに切り替える方法/属性呼び出し)
    
    IEnumerable src = ...;
    IEnumerator e = src.GetEnumerator();
    try
    {
      while (e.MoveNext()) Use(e.Current);
    }
    finally { if (e != null) e.Dispose(); }
    NET Fraamewark 4はTaskを導入して、NET Fraamewark 4.5/C龛5.0はawait/async非同期プログラミング文法糖を導入して、非同期の編纂過程を簡略化しました。コンパイラはawait/asyncシンタックス糖をコンディションマシンに変換し、Taskを生成し、内部でフィードバックする)
    ☺️以上からも分かるように、マイクロソフトはもっと速くて優雅にコードを作成するために、たくさんの飴をくれました。コンパイラはたくさんのことをしました。
    C铉は反復、非同期のショートカットを提供していますが、両者を結合してもいいですか?
    両者の結合の効果は、データが準備された時にデータを受信して処理することを期待していますが、cpuをブロックする形で待つことはできません。これはlotフロー式データでよく見られます。
    非同期反復
    リストページのリンクを通じて、リンクの後ろにあるhtmlの内容をキャプチャして表示する爬虫類があります。

    これは「相互に独立した長い時間消費行動の集合(それぞれ5,4,3,2,1 sを仮定する)」であり、
    私たちはC铉8.0非同期エニュメレーションタイプIAsyncEnumerableを使って、非同期にエニュメレーション要素を発生/消費します。
    同期バージョンのIEmnerabaleと同様に、IAsync Enumerableにも対応するIAsync Enumeratorディケンサがあり、ディケンサの実現過程はforeach消費の順序を決定しました。
    Cシ8.0 Aynchronous strems
    C((zhi 8.0)の重要な特性は非同期ストリームであり、簡単に非同期リストを作成し、消費することができます。
    非同期ストリームを返す方法の特徴:
  • async修飾子で声明
  • は、IAsyncenumerable<T>オブジェクト
  • に戻る。
  • 方法は、非同期継続的に要素
  • を返すための、yield return文を含む。
    
    static async Task Main(string[] args)
    {
          Console.WriteLine(DateTime.Now + $"\tThreadId:{Thread.CurrentThread.ManagedThreadId}\r
    ");       await foreach (var html in FetchAllHtml())       {            Console.WriteLine(DateTime.Now + $"\tThreadId:{Thread.CurrentThread.ManagedThreadId}\t" + $"\toutput:{html}");       }       Console.WriteLine("\r
    " + DateTime.Now + $"\tThreadId:{Thread.CurrentThread.ManagedThreadId}\t");       Console.ReadKey();  }  static async IAsyncEnumerable<string> FetchAllHtml()  {     for (int i = 5; i >= 1; i--)     {         var html = await Task.Delay(i* 1000).ContinueWith((t,i)=> $"html{i}",i);    //           yield return html;     }  }
    for循環はyieldキーワードを結合して、IAsyncenumeratorの実現を決定しました。
    以上のコードはawait foreachを非同期的に列挙する時、forサイクルと同じ順序を採用します。すなわち、非同期の任務を生み出す順序です。

    以上は15 sを待っていません。そしてすべてのデータを一気に投げ出します。 列挙によるforサイクルです。  順番に準備して、順次表示して、全部でまだ15 sを費やして、一回の列挙はすべて非同期です。
    追加思考:面白いローズマリーを生み出す
    ☺️ しかし、私の心の中では、異歩の任務を遂行する順番によって、先に先に消費を完成することができるかどうか、これは人の常ではないかと思っています。
    
    static async IAsyncEnumerable<string> FetchAllHtml()
    {  
        var tasklist= new List<Task<string>>();
        for (int i = 5; i >= 1; i--)
        {
            var t= Task.Delay(i* 1000).ContinueWith((t,i)=>$"html{i}",i);      //        
            tasklist.Add(t);
        }
         while(tasklist.Any())  
        {
           var tFinlish = await Task.WhenAny(tasklist);
           tasklist.Remove(tFinlish); 
           yield return await tFinlish;
        }
    }
    上に私は先に待つべきタスクリストを作成し、Task.WhenAny()を通過しました。 非同期タスクの最初に完了した反復要素を返します。  

    以上の総消耗時間は時間がかかります。そのエニュメレーションタスクは5 sです。
    NETCore 3.1は既にwebapiにおいて非同期ストリームを使用することができ、我々がフローデータをHTTP応答に戻すことができることを意味する。
    フロントエンドもすでに実験的なStreams APIがあり、ストリームデータを消費することができる。
    転送ゲート:    https://developer.mozilla.org/en-US/docs/Web/API/Streams_API
    ブラウザ対応リスト:    https://developer.mozilla.org/en-US/docs/Web/API/Streams_APIcomptibility
    ウェブアプリケーションに対して、これは相互作用性を高めることができる:
    長い時間を過ごす行動のリストデータが複数含まれていることを想像します。今はすべてのデータを待つ必要はないです。
    以上はccus Aync stremsの使用解析の詳細です。cync stremsの使用に関する資料は他の関連記事に注目してください。