Поделиться через


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

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

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

Число байтов, считанных из потока, находится между 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();
}
let endReadCallback (asyncResult: IAsyncResult) =
    let tempState = asyncResult.AsyncState :?> State
    let readCount = tempState.FStream.EndRead asyncResult

    let mutable i = 0
    let mutable errored = false

    while i < readCount do
        if tempState.ReadArray[i] <> tempState.WriteArray[i] then
            printfn "Error writing data."
            tempState.FStream.Close()
            errored <- true
            i <- readCount

        i <- i + 1

    printfn $"The data was written to {tempState.FStream.Name} and verified."
    tempState.FStream.Close()
    // Signal the main thread that the verification is finished.
    tempState.ManualEvent.Set() |> ignore
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 будет блокироваться до завершения операции ввода-вывода.

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

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