Недавно я программировал с помощью библиотеки FSharpx и особенно ее TaskBuilder. Теперь мне интересно, можно ли определить функцию, которая принимает параметры и получает результат. Такие как
let doTask(parameter:int) =
let task = TaskBuilder(scheduler = TaskScheduler.Current)
task {
return! Task.Factory.StartNew(fun() -> parameter + 1)
}
match FSharpx.Task.run doTask(1) with
| _ -> ()
Глядя на исходный код, я вижу run ожидает, что функция не принимает параметров и возвращает Task<'a>
. Не похоже, чтобы были примеры на FSharpx TaskTests а> либо.
Я был бы признателен, если бы кто-нибудь мог посоветовать, как мне реализовать такой сценарий с FSharpx, или если кто-то не должен использовать такую библиотеку по причине, которую я еще не совсем понял.
‹изменить: я думаю, что могу обернуть doTask следующим образом
wrapperDoTask() = doTask(101)
match FSharpx.Task.run wrapperDoTask with
| _ -> ()
И это может сработать. В настоящее время я не работаю с компилятором, так что это немного махание руками. У кого-нибудь есть мнение по какому-либо направлению или я просто ответил на свой вопрос? :)
‹edit2: я думаю, что мне нужно отредактировать это еще раз на основе ответа MisterMetaphor. Особенно его P.S.
, я думаю, был хорошо информирован. Я использую FSharpx TaskBuilder для взаимодействия с C#, в котором, как уже отмечалось, задачи возвращаются как горячие (за некоторыми незначительными исключениями), уже запущенные. Это связано с моим недавним вопросом Преобразование кода C# с асинхронным ожиданием в F# относительно планировщика и относительно Orleans ( Я добавлю несколько тегов, чтобы усилить контекст, может быть, кто-то еще размышляет над этим).
Говоря с точки зрения C#, я пытаюсь добиться ожидания результата задачи перед возвратом, но без блокировки. Поведение, которое мне нужно, особенно относится к поведению await
, а не .Result
. Разницу можно прочитать, например, из
Пытаться понять, какой контекст, или планировщик, или поведение, или что-то еще происходит с точки зрения C#, для меня несколько нечетко. К сожалению, похоже, что я не могу игнорировать все детали, когда дело доходит до взаимодействия. :)