4

こんにちは、 Async CallbacksSocketsでどのように機能するかについて詳しく知りたいです。

私のUI Threadから、 BeginReadメソッドを呼び出して、 Readという名前のコールバックを渡すとしましょう。私の理解では、BeginReadは新しいスレッド(スレッド A)を生成するため、UI スレッドでのコード実行は続行できます。コールバックReadThread Aで実行されますよね? EndReadでブロックします。

次に、コールバックが終了すると、スレッド Aは自動的に閉じますか?

コールバックが呼び出されると、スレッド A自体が閉じられるという前提で:::

終了する直前にスレッド A内で別のBeginReadを呼び出しても安全ということですか? このBeginReadThread Bを生成します。スレッド Bは、スレッド Aである呼び出し元のスレッドが終了したため、実行に失敗したり、正しく配置できなかったりしますか? または、スレッドは呼び出し元にまったく依存していませんか?

4

2 に答える 2

2

ここでいくつかの誤解があります。指定したコールバックを呼び出すとBeginRead、アプリケーションの内部スレッド プール内から呼び出されます。通常、新しいスレッドは開始されませんが、.NET の内部スケジューラによって開始される可能性があります。

デバッガーでプログラムを中断し、[スレッド] ビューに移動すると、ワーカー スレッドという名前のこれらのスレッドの束が表示されます。通常、全員が就寝中で仕事を待っています。BeginReadこれは、読み取りたいたびにスレッドを起動するよりもはるかに高速な方法です。代わりに、バックグラウンドで準備ができているこれらのワーカーを使用します。

コールバックが完了すると、ワーカー スレッドはプールに戻り、次のアクションの準備が整います。

残りの質問について:

  • コールバックは でブロックされるべきではありませんEndRead。アプリケーションにブロックはありません。IO データはバッファリングされた状態で利用できます。この場合、コールバックはほぼ瞬時に実行されます。または、データは後で利用可能になります。その場合、コールバックはデータが表示された後にのみ実行されます。これは重要なポイントです。データを待機している間は、何かを待機するスレッドが存在しないことを意味するからです。ランタイムは待機を処理し、データが表示されるとコールバックを生成します。
  • はい、BeginReadコールバックから別のものを呼び出しても安全です。依存関係はありません。実際、そのように IO を行うのは良い方法です。
  • スレッドが呼び出し元に依存することはありません。それらは完全にスタンドアロンであり、自然に終了するか、プロセス自体が終了した場合にのみ終了します。
于 2012-08-25T09:27:46.170 に答える
0

BeginRead通常、async IO と呼ばれるオペレーティング システムの機能を使用します。Windows カーネルでは、スレッドを IO 操作に関連付ける必要はありません。

繰り返しますが、BeginRead1,000 回呼び出すことができ、スレッドが 1 つも開始またはブロックされることはありません。

オペレーティング システムはスレッド プールへのコールバックの実行をキューに入れますが、それは待機が終了した場合のみです。EndReadその後、待機せずにすぐに完了します。

BeginReadコールバックから安全に呼び出すことができます (通常は を呼び出した後EndRead)。

于 2012-08-25T11:23:00.797 に答える