FileStream.EndRead(IAsyncResult) Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
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.