Я беспокоюсь, что мой предыдущий ответ был не совсем то, что вы хотите. То, что я поставил, просто вызвало ошибку компиляции. Но одна вещь об этом заключается в том, что он не работает асинхронно. Task.Wait
и Async.RunSynchronously
будут блокировать бегущую нить до завершения операции.
Если вы хотите на самом деле быть асинхров, т.е. не блокирует, вы должны поместить весь метод, или, по крайней мере, последняя часть его, в async
блок, таким образом, что вы на самом деле возвращающий async
ора вызывающему абоненту. Таким образом, ответ будет
let someFunction (req : HttpRequestMesssage) a b =
async {
let! readToProvider = (req.Content.ReadAsMultipartAsync provider) |> Async.AwaitIAsyncResult
return req.CreateResponse HttpStatusCode.OK
}
Это опция возвращает не ответ, но Async<Response>
. Итак, теперь вызывающий может решить, как его запускать, блокируя или по-настоящему асинхронно.
Таким образом, если вы используете веб-сервер, который обрабатывает асинхронные запросы, то вы можете просто подключить эту функцию к конечной точке (возможно преобразование Async
в Task
в точке подключения, так как большинство веб-серверов .net асинхронными написаны с точки зрения C#), и он будет выполняться асинхронно, не блокируя поток. Или, если вы вызываете его из другого async op, вы можете сделать do! someFunction ...
, и он будет выполняться асинхронно. Но если вызывающему пользователю все равно, и он просто хочет работать синхронно, он может сделать someFunction ... |> Async.RunSynchronously
. Таким образом, вы получаете большую гибкость. И вы всегда можете определить let someFunctionSync ... = someFunction ... |> Async.RunSynchronously
, если это более распространенный вариант использования.
Я бы рекомендовал пройти этот путь, если вы действительно не хотите применять блокировку.