Считывает ли Task.Factory.FromAsync (BeginRead, EndRead) весь блок данных перед завершением? - PullRequest
0 голосов
/ 03 октября 2011

В моем коде сейчас у меня есть что-то вроде этого:

state.BytesRead += readPacket.Result;

if (state.BytesRead < state.Data.Length)
{
    Read(state);
}
else
{
    nextRead(state);
}

Однако я заметил, что первый оператор if никогда не выполняется.Я попытался сделать что-то вроде этого, чтобы увидеть, смогу ли я когда-нибудь запустить условное выражение:

tcpClient.SendBufferSize = 16;
tcpClient.ReceiveBufferSize = 16;

Но все равно оно никогда не запускается.Я отправляю большое количество данных (строки длиной более 1000 символов) между клиентом и сервером, но условие не выполняется.Похоже, он просто всегда читает все байты одновременно.

Это потому, что я использую Task.Factory.FromAsync, и что он завершается только после чтения во всех байтах?Вот строка кода, которая вызывает фрагмент кода в верхней части моего поста:

Task<int>.Factory.FromAsync(state.Stream.BeginRead, state.Stream.EndRead, state.Data, state.BytesRead, state.Data.Length - state.BytesRead, state);

Я использовал асинхронные обратные вызовы до FromAsync, и все учебники для этого требовали проверки, все ли байты были прочитаны перед продолжениемсо следующим чтением.Это больше не нужно с FromAsync?Теперь это обрабатывается автоматически?

1 Ответ

1 голос
/ 03 октября 2011

Task.Factory.FromAsync просто создает небольшой каркас вокруг уже существующих асинхронных пар BeginXXX / EndXXX. Поскольку методы просто обертываются и вызываются средой, а не вызываются явно, метод, с помощью которого они работают, останется неизменным.

...