У меня очень похожий код при использовании стандартных методов BeginRead и EndRead из TcpClient и использования Task.Factory.FromAsync.
Вот несколько примеров. Ошибка обработки кода не отображается.
Task.Factory.FromAsync:
private void Read(State state)
{
Task<int> read = Task<int>.Factory.FromAsync(state.Stream.BeginRead, state.Stream.EndRead, state.Bytes, state.BytesRead, state.Bytes.Length - state.BytesRead, state, TaskCreationOptions.AttachedToParent);
read.ContinueWith(FinishRead);
}
private void FinishRead(Task<int> read)
{
State state = (State)read.AsyncState;
state.BytesRead += read.Result;
}
Стандартное использование обратных вызовов с BeginRead и EndRead:
private void Read(State state)
{
client.BeginRead(state.Bytes, state.BytesRead, state.Bytes.Length - state.Bytes.Read, FinishRead, state);
}
private void FinishRead(IAsyncResult async)
{
State state = (State)async.AsyncState;
state.BytesRead += state.Stream.EndRead(async);
}
Обе эти работы прекрасны, но мне любопытно их отличия. Строки кода для обоих в значительной степени эквивалентны, и оба они, похоже, выполняют ту же самую функцию и имеют одинаковую эффективность. Какой из них предпочтительнее? Что бы вы предпочли в производственном коде?