Мне было интересно, что будет эквивалентно асинхронному C # main
в F #. Более того, существует ли особый способ использования / использования асинхронных методов из main
в F # -программе или это просто вопрос ожидания завершения?
Чтобы быть более конкретным, скажем, что мы используем .NET Core Generic Host.
В программе на C # main
может выглядеть так:
class Program
{
static async Task Main(string[] args)
{
await new HostBuilder().Build().RunAsync();
}
}
В F # программе мой инстинкт должен был бы сделать что-то вроде этого:
[<EntryPoint>]
let main args =
HostBuilder().Build.RunAsync().Wait()
... или ...
[<EntryPoint>]
let main args =
HostBuilder().Build.RunAsync() |> Async.AwaitTask |> Async.RunSynchronously
... или ...
[<EntryPoint>]
let main args =
async {
return HostBuilder().Build.RunAsync() |> Async.AwaitTask
} |> Async.RunSynchronously
... или просто избегайте асинхронности ... но это не весело ...
[<EntryPoint>]
let main args =
HostBuilder().Build.Run()
Есть еще несколько формулировок, которые я мог бы показать, но я думаю, что они имеют смысл.
Я думаю, что часть ответа заключается в ответе на эти другие вопросы
- "что означает запуск асинхронного основного метода" и
- "Какой смысл делать основной асинхронный?"
Исходя из примеров, async main
, по-видимому, в основном дает возможность другим местам вызывать main
асинхронным способом (в тех случаях, когда main
на самом деле не является "основным", т. Е. Модульным тестированием). , так далее).
В случае F # я думаю, что есть как минимум 2 вещи, которые мешают одному просто вернуть асинхронное вычисление из main
:
- EntryPointAttribute, который обеспечивает тип возвращаемого значения int для кодов состояния ... верно?
- Компилятор, вероятно, не готов обрабатывать асинхронные вычисления как выходное значение программы ... верно?