例:C#とは? わかりやすく解説

例:C#

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/07/30 15:31 UTC 版)

Async/await」の記事における「例:C#」の解説

以下のC#メソッド関数)は、指定されURIからリソースダウンロードし、そのリソース長さ返すpublic static async Task FindPageSize(Uri uri) { byte[] data = await new WebClient().DownloadDataTaskAsync(uri); return data.Length;} まず、asyncキーワードはC#コンパイラーに対してメソッド非同期であることを示す。つまり、任意の数のawait式を使用でき、結果promiseバインドする。 戻り値の型であるTask<T> は、C#におけるpromise類似形であり、ここではint型結果値を持つことが示されている。 このメソッド呼び出されたときに最初に実行される式は、new WebClient() である。DownloadDataTaskAsync(uri)は、Task<byte[]>を返す別の非同期メソッドである。このメソッド非同期であるため、戻る前にデータバッチ全体ダウンロードしない。代わりに、非ブロッキングメカニズム(ハードウェアによりオフロードされた実行コンテキストや、バックグラウンドスレッドなど)を使用してダウンロードプロセスを開始し解決拒否もされていないTask<byte[]>をこのメソッドに対して即座に返すTaskアタッチされたawaitキーワードによって、このメソッドはすぐにTask<int>を呼び出し元に返し呼び出し元は必要に応じて他の処理を続行できる。 DownloadDataTaskAsync()ダウンロード完了すると、そのダウンロードしたデータによって、以前返却していたTask解決する。これによりコールバックトリガーされ、その値をdata割り当てることでFindPageSize()実行継続させる最後にメソッドは、配列長さを示す単純な整数値であるdata.Lengthを返すコンパイラーは、以前返却されTask解決するものとしてこれを再解釈し、その長さの値を使って何かをするためにメソッド呼び出し元においてコールバックトリガーする。 async/await使用するメソッドは、必要な数のawait式を使用でき、それぞれが同じ方法処理されるpromise最初awaitに対してのみ呼び出し元に返されるが、他のすべてのawait内部コールバック利用する)。関数promiseオブジェクト直接保持し最初に他の処理(他の非同期タスク開始を含む)を実行して結果必要になるまでpromise待機遅らせるともできるpromise使用する関数には、複数promise一度にまたは特定のパターンC#Taskなど)で待機できるようにするpromise集計メソッドもある: Task.WhenAll() は、引数内のすべてのTask解決されたときに解決される、値のないTask返す多くpromiseタイプには、複数結果コールバック設定したり、特に長時間実行されるタスク進行状況検査したりできるなど、async/awaitパターン通常使用する機能超える追加機能がある。 C#特定のケース、およびこの言語機能備えた他の多く言語では、async/awaitパターン言語ランタイムコアパーツではなくコンパイル時にラムダまたは継続使用して実装される。たとえば、C#コンパイラーは、上記コードIL バイトコード形式変換する前に次のようなコード変換する可能性がある。 public static Task FindPageSize(Uri uri) { Task data_task = new WebClient().DownloadDataTaskAsync(uri); Task after_data_task = data_task.ContinueWith((original_task) => { return original_task.Result.Length; }); return after_data_task;} このため、インターフェイスメソッドがpromiseオブジェクト返す必要があるが、それ自体非同期タスク待機するawait本文での待機を必要としない場合async修飾子必要なく、代わりにpromiseオブジェクト直接返すことができる。たとえば、関数はいくつかの結果値(C#のTask.FromResult()など)にすぐに解決されるプロミス提供できる場合があり、または単純に必要な正確なプロミスである別のメソッドプロミス返す場合もある(オーバーロードによって遅延する場合など)。 しかし、この機能一つ重要な注意点は、コード従来のブロッキングコードに似ている一方でコード実際にブロックおよびマルチスレッドであることにより、await付いた目標プロミス解決するのを待っている間に、多く介在事象発生する可能性があることを意味する。たとえば、次のコードは、awaitなしで常にブロッキングモデルで成功するが、await中にイベント発生する可能性があるため、その下から共有状態が変更されていることがわかる。 var a = state.a;var data = await new WebClient().DownloadDataTaskAsync(uri);Debug.Assert(a == state.a); // イベントハンドラー介入により値が変更される潜在的な問題がある。return data.Length;

※この「例:C#」の解説は、「Async/await」の解説の一部です。
「例:C#」を含む「Async/await」の記事については、「Async/await」の概要を参照ください。

ウィキペディア小見出し辞書の「例:C#」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

「例:C#」に関係したコラム

辞書ショートカット

すべての辞書の索引

「例:C#」の関連用語

例:C#のお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



例:C#のページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、WikipediaのAsync/await (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2025 GRAS Group, Inc.RSS