FileStream.EndRead(IAsyncResult) Метод

Определение

Ожидает завершения отложенной асинхронной операции чтения. (Рекомендуется использовать ReadAsync(Byte[], Int32, Int32, CancellationToken).)

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

Ссылка на ожидаемый отложенный асинхронный запрос.

Возвращаемое значение

Int32

Число байтов, считанных из потока, находится между 0 и числом запрошенных байтов. Потоки возвращают 0 только в конце потока, в противном случае они должны блокироваться, пока не будет доступен по крайней мере 1 байт.

Исключения

asyncResult имеет значение null.

Этот объект IAsyncResult не был создан путем вызова BeginRead(Byte[], Int32, Int32, AsyncCallback, Object) для данного класса.

EndRead(IAsyncResult) вызывается несколько раз.

Поток закрыт, или произошла внутренняя ошибка.

Примеры

Этот пример кода является частью большого примера, приведенного для FileStream(String, FileMode, FileAccess, FileShare, Int32, Boolean) конструктора.

   static void EndReadCallback( IAsyncResult^ asyncResult )
   {
      State^ tempState = dynamic_cast<State^>(asyncResult->AsyncState);
      int readCount = tempState->FStream->EndRead( asyncResult );
      int i = 0;
      while ( i < readCount )
      {
         if ( tempState->ReadArray[ i ] != tempState->WriteArray[ i++ ] )
         {
            Console::WriteLine( "Error writing data." );
            tempState->FStream->Close();
            return;
         }
      }

      Console::WriteLine( "The data was written to {0} "
      "and verified.", tempState->FStream->Name );
      tempState->FStream->Close();
      
      // Signal the main thread that the verification is finished.
      tempState->ManualEvent->Set();
   }


public:
static void EndReadCallback(IAsyncResult asyncResult)
{
    State tempState = (State)asyncResult.AsyncState;
    int readCount = tempState.FStream.EndRead(asyncResult);

    int i = 0;
    while(i < readCount)
    {
        if(tempState.ReadArray[i] != tempState.WriteArray[i++])
        {
            Console.WriteLine("Error writing data.");
            tempState.FStream.Close();
            return;
        }
    }
    Console.WriteLine("The data was written to {0} and verified.",
        tempState.FStream.Name);
    tempState.FStream.Close();

    // Signal the main thread that the verification is finished.
    tempState.ManualEvent.Set();
}
Private Shared Sub EndReadCallback(asyncResult As IAsyncResult)
     Dim tempState As State = _
         DirectCast(asyncResult.AsyncState, State)
     Dim readCount As Integer = _
         tempState.FStream.EndRead(asyncResult)

     Dim i As Integer = 0
     While(i < readCount)
         If(tempState.ReadArray(i) <> tempState.WriteArray(i))
             Console.WriteLine("Error writing data.")
             tempState.FStream.Close()
             Return
         End If
         i += 1
     End While

     Console.WriteLine("The data was written to {0} and " & _
         "verified.", tempState.FStream.Name)
     tempState.FStream.Close()

     ' Signal the main thread that the verification is finished.
     tempState.ManualEvent.Set()
 End Sub

Комментарии

в платформа .NET Framework 4 и более ранних версиях необходимо использовать методы, такие как BeginRead и, EndRead для реализации асинхронных файловых операций. эти методы по-прежнему доступны в платформа .NET Framework 4,5 для поддержки устаревшего кода; Однако новые асинхронные методы, такие как ReadAsync ,, WriteAsync CopyToAsync и FlushAsync , упрощают реализацию асинхронных операций с файлами.

EndRead метод должен вызываться точно для каждого вызова метода BeginRead . Невозможность завершить процесс чтения до начала другого чтения может привести к нежелательному поведению, например к взаимоблокировке.

Этот метод переопределяет метод EndRead.

EndRead может вызываться для каждого IAsyncResult из BeginRead . Вызов EndRead сообщает, сколько байтов было считано из потока. EndRead будет блокироваться до завершения операции ввода-вывода.

Применяется к

См. также раздел