2

私の知る限り-(そして私はそれについてたくさん読んだ)、ファイルの読み取りやファイルのダウンロードなどのI / O操作を処理するときの「スレッドがブロックされている」問題を解決するために、非同期メソッド(非同期デリゲートではありません!)が存在します:

リヒターはそれをここで非常に明確に示しています:

ここに画像の説明を入力

  • Task<T>I/O ブロッキングの問題とは関係ありません。それは単にスレッドを開くのと同じです(さらに効率性と機能性が向上します)-ただし、それでもスレッドがCPUクォンタムなどを消費します.

そして、ここに私の質問があります:

私は(msdn)それを読んだ:

非同期メソッドは、呼び出し元のスレッドをブロックすることなく、長時間実行される可能性のある作業を行うための便利な方法を提供します。非同期メソッドの呼び出し元は、非同期メソッドの終了を待たずに作業を再開できます。

  • Task<t>withを作成するのと同じContinueWithですか?

  • 用語がややこしくないですか?asynchronous methods操作用ですi/o( i/o 操作が行われている間待機しているスレッドがなく、それを処理しているスレッドがありません) しかし 、(async を使用する) コードを as: と呼ぶの asynchronous methodsは少し混乱します。そう思わない?実行中の別のスレッドがあると想定しているためです...(これが実際に私の最初の質問です)。

混乱はどこから?

アルバハリは、非同期メソッドの目的を強調する傾向があるためです。

ここに画像の説明を入力

ps私はこのトピックに関してSOでいくつかの質問を読みましたが、io操作を処理するために非同期メソッドがここにあるという誤分類について話しているものは見つかりませんでした

4

2 に答える 2

4

Task<T>I/O ブロッキングの問題とは関係ありません。これは単純にスレッドを開くのと同じです (さらに効率と機能が追加されます) が、それでもスレッドが CPU クォンタムなどを消費します。

必ずしも。基本的に s には 2 種類ありますTask。1 つはコードの同期部分を実行し、そのコードの実行が終了すると完了します。この種のTaskブロックはThread、実行が開始されてから完了するまで (成功するかどうかにかかわらず) ずっとブロックされます。

しかし、別の種類のTask: 何かが起こったときに完了するものがあります。この種のTaskものは、.Net 4.5 および C# 5.0 が頻繁に使用するものであり、a をThread(少なくとも直接的には) ブロックしません。Taskを使用して、そのようなものを自分で作成できますTaskCompletionSource<T>

(もう 1 つのポイントは、ブロックされたスレッドは CPU をまったく消費しないということですが、ここではあまり関係ありません。)

Task<t>withを作成するのと同じContinueWithですか?

はい、await tによく似ていt.ContinueWith(rest of the method)ます。

用語がややこしくないですか?非同期メソッドは I/O 操作用です (I/O 操作が行われている間待機しているスレッドがなく、それを処理しているスレッドがありません)。しかし、(async を使用する) コードを as: 非同期メソッドとして呼び出すのは少し混乱します。そう思わない?実行中の別のスレッドがあると想定しているためです。

混乱は見られません。従来の非同期メソッド ( のようにBeginRead()、これは「非同期プログラミング モデル」または APM と呼ばれます) は、操作を開始し、完了時に (コールバックを介して) 通知を受ける方法です。最新の非同期メソッド ( のようにReadAsync()、これは「タスクベースの非同期パターン」または TAP と呼ばれます) も、操作を開始し、完了時に通知を受ける方法です ( を使用await)。

どちらの場合も、メソッドが戻る前に実行されるコードが存在する可能性があります ( awaitTAP の場合は最初のコードより前のコード)。

どちらの場合も、結果を通知する通常の方法では、スレッドはブロックされません (APM の場合はコールバック、awaitTAP の場合)。

どちらの場合も、必要に応じてブロッキング待機を使用できます ( EndXxx()APMのメソッドWait()、TAP のメソッドをすぐに呼び出します)。

BeginInvoke()どちらの場合も、バックグラウンド スレッド ( APM の場合はデリゲート、Task.Factory.StartNew()TAP の場合)で同期コードを実行するために使用できます。

繰り返しますが、混乱は見られません。2 つのモデルは非常に似ているように見えます。

于 2013-06-15T15:56:23.527 に答える