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を強タイプに切り替える方法/属性呼び出し)
☺️以上からも分かるように、マイクロソフトはもっと速くて優雅にコードを作成するために、たくさんの飴をくれました。コンパイラはたくさんのことをしました。
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文を含む。
以上のコードはawait foreachを非同期的に列挙する時、forサイクルと同じ順序を採用します。すなわち、非同期の任務を生み出す順序です。
以上は15 sを待っていません。そしてすべてのデータを一気に投げ出します。 列挙によるforサイクルです。 順番に準備して、順次表示して、全部でまだ15 sを費やして、一回の列挙はすべて非同期です。
追加思考:面白いローズマリーを生み出す
☺️ しかし、私の心の中では、異歩の任務を遂行する順番によって、先に先に消費を完成することができるかどうか、これは人の常ではないかと思っています。
以上の総消耗時間は時間がかかります。そのエニュメレーションタスクは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の使用に関する資料は他の関連記事に注目してください。
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)の重要な特性は非同期ストリームであり、簡単に非同期リストを作成し、消費することができます。
非同期ストリームを返す方法の特徴:
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の使用に関する資料は他の関連記事に注目してください。