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 = (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 блокируется до завершения операции ввода-вывода.