NetworkStream.EndRead(IAsyncResult) メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
非同期読み取りの終了を処理します。
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。
戻り値
NetworkStream から読み取るバイト数。
例外
asyncResult
パラメーターが null
です。
NetworkStream が閉じています。
例
次のコード例では、 myReadCallback
コールバック メソッドとして提供されています BeginRead 。 EndReadによって開始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 渡される状態オブジェクトを取得するプロパティ IAsyncResult を BeginRead 呼び出します。 この状態オブジェクトから受信側を NetworkStream 抽出します。 取得した後、 NetworkStreamメソッドを EndRead 呼び出して読み取り操作を正常に完了し、読み取られたバイト数を返します。
このメソッドは EndRead 、データが使用可能になるまでブロックします。 メソッドはEndRead、メソッドのパラメーターで指定されたバイト数まで、使用可能な量のデータをsize
BeginRead読み取ります。 リモート ホストが接続を Socket シャットダウンし、使用可能なすべてのデータを受信した場合、メソッドはすぐに完了し、 EndRead 0 バイトを返します。
受信したデータを取得するには、次のプロパティを AsyncState 呼び出し、結果の IAsyncResult状態オブジェクトに含まれるバッファーを抽出します。
注意
を受け取った場合は IOException、プロパティを InnerException 調べて、それが原因 SocketExceptionかどうかを確認します。 その場合は、プロパティをErrorCode使用して特定のエラー コードを取得し、エラーの詳細な説明については、Windows Sockets バージョン 2 API エラー コードのドキュメントを参照してください。