Библиотеки фреймворка .NET 4.5 довольно широко интегрируют асинхронность на основе задач в стиле C #. Во многих случаях они также продолжают предоставлять пары методов начала / конца в стиле APM. F # может легко адаптировать любой метод к асинхронным вычислениям в стиле F #.
У меня такой вопрос, учитывая, что операция, связанная с вводом-выводом, которая реализована в каркасе как асинхронное начало / конец и основанная на задачах, есть ли преимущество в производительности или памяти при выборе одного из других при адаптации к асинхронному F #?
Например, в .NET 4.5 System.IO.Stream
имеет BeginRead и ReadAsync . Это значит, что я могу сделать это ...
type System.IO.Stream with
member x.AsyncRead(buffer, offset, count) =
Async.FromBeginEnd(buffer, offset, count, x.BeginRead, x.EndRead)
Или я могу сделать это ...
type System.IO.Stream with
member x.AsyncRead(buffer, offset, count) =
x.ReadAsync(buffer, offset, count) |> Async.AwaitTask
Есть ли причина предпочитать одно другому? Основное различие, о котором я могу думать, состоит в том, что операция чтения уже началась, когда возвращается второй метод расширения, но не с первым методом расширения.