Udostępnij za pośrednictwem


FileStream.EndRead(IAsyncResult) Metoda

Definicja

Czeka na ukończenie oczekującej operacji odczytu asynchronicznego. (Rozważ użycie ReadAsync(Byte[], Int32, Int32, CancellationToken) zamiast tego).

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

Parametry

asyncResult
IAsyncResult

Odwołanie do oczekującego żądania asynchronicznego do oczekiwania.

Zwraca

Liczba bajtów odczytanych ze strumienia z zakresu od 0 do żądanej liczby bajtów. Strumienie zwracają tylko 0 na końcu strumienia, w przeciwnym razie powinny blokować do co najmniej 1 bajtu.

Wyjątki

asyncResult to null.

Ten IAsyncResult obiekt nie został utworzony przez wywołanie BeginRead(Byte[], Int32, Int32, AsyncCallback, Object) tej klasy.

EndRead(IAsyncResult) jest wywoływana wiele razy.

Strumień jest zamknięty lub wystąpił błąd wewnętrzny.

Przykłady

Ten przykład kodu jest częścią większego przykładu podanego dla konstruktora 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

Uwagi

W .NET Framework 4 i starszych wersjach należy używać metod, takich jak BeginRead i EndRead do implementowania asynchronicznych operacji plików. Te metody są nadal dostępne w .NET Framework 4.5 do obsługi starszego kodu. Jednak nowe metody asynchroniczne, takie jak ReadAsync, WriteAsync, CopyToAsynci FlushAsync, ułatwiają implementowanie operacji asynchronicznych.

EndRead musi być wywoływana dokładnie dla każdego wywołania metody BeginRead. Niepowodzenie zakończenia procesu odczytu przed rozpoczęciem innego odczytu może spowodować niepożądane zachowanie, takie jak zakleszczenie.

Ta metoda zastępuje EndRead.

EndRead można wywołać dla każdego IAsyncResult elementu z BeginRead. Wywołanie EndRead informuje o tylu bajtach odczytanych ze strumienia. EndRead zostanie zablokowana do momentu ukończenia operacji we/wy.

Dotyczy

Zobacz też