Разница между Task.Factory.FromAsync и BeginX / EndX?

У меня очень похожий код при использовании стандартных методов 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);
}

Оба они работают нормально, но мне любопытно их различия. Строки кода для обоих в значительной степени эквивалентны, и оба они, похоже, выполняют одну и ту же функцию и имеют одинаковую эффективность. Какой предпочтительнее? Что бы вы предпочли увидеть в производственном коде?

11
задан Taryn 12 June 2012 в 17:11
поделиться