Следует иметь в виду, что Async.RunSynchronously
по сути то же самое, что доступ к Result
. Обе эти операции блокируют текущий поток, ждут завершения фоновой операции и затем дают вам результат.
Это означает, что нет смысла использовать async { .. }
, если вам нужно будет дождаться результата, используя RunSynchronously
. (Помимо того факта, что RunSynchronously
имеет очень длинное и уродливое имя, которое явно и ясно говорит вам, что это то, что происходит!)
Если вы можете структурировать свой код так, чтобы вам не нужно было ждать , то стоит изменить getApps
, чтобы он возвращал результат асинхронно:
let getApps (context: MyContext) = async {
let! repos =
context.Provider.GetService<AppRepository>().GetActiveAsync()
|> Async.AwaitTask
return repos |> List.map printName }
Затем вы можете вызвать это из другого блока async { .. }
и, в конечном итоге, запустить вычисление в фоновом режиме с помощью Async.Start
. Однако нет смысла делать это, если вы будете использовать Async.RunSynchronously
.