NetworkStream.EndRead(IAsyncResult) メソッド

定義

非同期読み取りの終了を処理します。

public:
 override int EndRead(IAsyncResult ^ asyncResult);
public override int EndRead (IAsyncResult asyncResult);
override this.EndRead : IAsyncResult -> int
Public Overrides Function EndRead (asyncResult As IAsyncResult) As Integer

パラメーター

asyncResult
IAsyncResult

非同期呼び出しを表す IAsyncResult

戻り値

Int32

NetworkStream から読み取るバイト数。

例外

asyncResult パラメーターが null です。

基になっている Socket が閉じています。

  • または - ソケットへのアクセス中にエラーが発生しました。

NetworkStream が閉じています。

次のコード例では、 myReadCallback コールバック メソッドとして提供されています BeginReadEndReadによって開始BeginReadされた非同期読み取り呼び出しを完了するために実装されますmyReadCallback

// Example of EndRead, DataAvailable and BeginRead.
static void myReadCallBack( IAsyncResult^ ar )
{
   NetworkStream^ myNetworkStream = safe_cast<NetworkStream^>(ar->AsyncState);
   array<Byte>^myReadBuffer = gcnew array<Byte>(1024);
   String^ myCompleteMessage = "";
   int numberOfBytesRead;
   numberOfBytesRead = myNetworkStream->EndRead( ar );
   myCompleteMessage = String::Concat( myCompleteMessage, Encoding::ASCII->GetString( myReadBuffer, 0, numberOfBytesRead ) );
   
   // message received may be larger than buffer size so loop through until you have it all.
   while ( myNetworkStream->DataAvailable )
   {
      AsyncCallback^ pasync = gcnew AsyncCallback( &myReadCallBack );
      myNetworkStream->BeginRead( myReadBuffer, 0, myReadBuffer->Length, pasync, myNetworkStream );
   }

   // Print out the received message to the console.
   Console::WriteLine( "You received the following message : {0}", myCompleteMessage );
}
// Example of EndRead, DataAvailable and BeginRead.

public static void myReadCallBack(IAsyncResult ar ){

    NetworkStream myNetworkStream = (NetworkStream)ar.AsyncState;
    byte[] myReadBuffer = new byte[1024];
    String myCompleteMessage = "";
    int numberOfBytesRead;

    numberOfBytesRead = myNetworkStream.EndRead(ar);
    myCompleteMessage =
        String.Concat(myCompleteMessage, Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));

    // message received may be larger than buffer size so loop through until you have it all.
    while(myNetworkStream.DataAvailable){
        
        myNetworkStream.BeginRead(myReadBuffer, 0, myReadBuffer.Length,
                                                   new AsyncCallback(NetworkStream_ASync_Send_Receive.myReadCallBack),
                                                   myNetworkStream);
    }

    // Print out the received message to the console.
    Console.WriteLine("You received the following message : " +
                                myCompleteMessage);
}
' Example of EndRead, DataAvailable and BeginRead.
Public Shared Sub myReadCallBack(ar As IAsyncResult)
   
   Dim myNetworkStream As NetworkStream = CType(ar.AsyncState, NetworkStream)
   Dim myReadBuffer(1024) As Byte
   Dim myCompleteMessage As [String] = ""
   Dim numberOfBytesRead As Integer
   
   numberOfBytesRead = myNetworkStream.EndRead(ar)
   myCompleteMessage = [String].Concat(myCompleteMessage, Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead))
   
   ' message received may be larger than buffer size so loop through until you have it all.
   While myNetworkStream.DataAvailable
      
      myNetworkStream.BeginRead(myReadBuffer, 0, myReadBuffer.Length, New AsyncCallback(AddressOf NetworkStream_ASync_Send_Receive.myReadCallBack), myNetworkStream)
   End While
   
   
   ' Print out the received message to the console.
   Console.WriteLine(("You received the following message : " + myCompleteMessage))
End Sub

注釈

メソッドは EndRead 、メソッドで開始された非同期読み取り操作を BeginRead 完了します。

呼び出す BeginRead前に、デリゲートを実装するコールバック メソッドを作成する AsyncCallback 必要があります。 このコールバック メソッドは別のスレッドで実行され、戻り値の後 BeginRead にシステムによって呼び出されます。 コールバック メソッドは、メソッドから返された値をBeginReadパラメーターとして受け入れるIAsyncResult必要があります。

コールバック メソッド内で、メソッドに AsyncState 渡される状態オブジェクトを取得するプロパティ IAsyncResultBeginRead 呼び出します。 この状態オブジェクトから受信側を NetworkStream 抽出します。 取得した後、 NetworkStreamメソッドを EndRead 呼び出して読み取り操作を正常に完了し、読み取られたバイト数を返します。

このメソッドは EndRead 、データが使用可能になるまでブロックします。 メソッドはEndRead、メソッドのパラメーターで指定されたバイト数まで、使用可能な量のデータをsizeBeginRead読み取ります。 リモート ホストが接続を Socket シャットダウンし、使用可能なすべてのデータを受信した場合、メソッドはすぐに完了し、 EndRead 0 バイトを返します。

受信したデータを取得するには、次のプロパティを AsyncState 呼び出し、結果の IAsyncResult状態オブジェクトに含まれるバッファーを抽出します。

注意

を受け取った場合は IOException、プロパティを InnerException 調べて、それが原因 SocketExceptionかどうかを確認します。 その場合は、プロパティをErrorCode使用して特定のエラー コードを取得し、エラーの詳細な説明については、Windows Sockets バージョン 2 API エラー コードのドキュメントを参照してください。

適用対象

こちらもご覧ください