Каковы различные методы, которые вы можете использовать для создания экземпляров Async < 'T > в F #?
Я вижу, что существует несколько методов расширения для веб-клиента/запроса и потока файлов, но если я хочу написать собственный поставщик асинхронных вычислений, как бы я начал писать эти версии AsyncDoSomething
моего синхронного DoSomething
функции?
Я знаю, что вы можете использовать делегат одной и той же сигнатуры для обертывания исходной функции, а затем использовать Async.FromBeginEnd
в методах BeginInvoke
и EndInvoke
:
open System
let del : Func<int> = new Func<int>(fun () -> 42)
let delAsync = async {
let! res = Async.FromBeginEnd(del.BeginInvoke, del.EndInvoke)
printfn "result was %d" res
}
Async.Start delAsync
Но это немного напряжено, и это не похоже на "путь F #", поскольку вам нужно использовать делегатов, определенных в С# или VB (из которых есть много вариантов System.Action
и System.Func
, чтобы выбрать конечно), потому что делегаты F # не поддерживают методы BeginInvoke
и EndInvoke
.
Есть ли у кого-нибудь список различных способов записи асинхронной версии синхронной функции в F #?
Большое спасибо заранее!