FileStream.EndRead(IAsyncResult) Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Čeká na dokončení čekající asynchronní operace čtení. (Zvažte místo toho použití 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
Parametry
- asyncResult
- IAsyncResult
Odkaz na čekající asynchronní požadavek, na který se má čekat.
Návraty
Počet bajtů přečtených ze streamu mezi 0 a počtem požadovaných bajtů Streamy vrací na konci datového proudu pouze hodnotu 0, jinak by měly být blokované, dokud nebude k dispozici alespoň 1 bajt.
Výjimky
asyncResult
je null
.
Tento IAsyncResult objekt nebyl vytvořen voláním BeginRead(Byte[], Int32, Int32, AsyncCallback, Object) v této třídě.
EndRead(IAsyncResult) se volá vícekrát.
Datový proud se zavře nebo došlo k vnitřní chybě.
Příklady
Tento příklad kódu je součástí většího příkladu FileStream(String, FileMode, FileAccess, FileShare, Int32, Boolean) pro konstruktor.
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
Poznámky
V rozhraní .NET Framework 4 a starších verzích musíte k implementaci asynchronních operací se soubory použít metody, jako BeginRead jsou a EndRead . Tyto metody jsou stále k dispozici v rozhraní .NET Framework 4.5 pro podporu starší verze kódu; Nové asynchronní metody, jako ReadAsyncjsou , WriteAsync, CopyToAsynca FlushAsync, však pomáhají snadněji implementovat asynchronní operace se soubory.
EndRead musí být volána přesně pro každé volání metody BeginRead. Selhání ukončení procesu čtení před zahájením dalšího čtení může způsobit nežádoucí chování, jako je například zablokování.
Tato metoda přepíše EndRead.
EndRead lze volat při každém IAsyncResult z BeginRead. Volání EndRead vám řekne, kolik bajtů bylo přečteno ze streamu. EndRead se zablokuje, dokud se nedokončí vstupně-výstupní operace.