Метод WebClient.DownloadStringAsync является частью платформы .NET. Он будет вызывать событие, чтобы сигнализировать о его прогрессе, и его тип возвращаемого значения будет unit
, поэтому вы не хотите его использовать, и нет никакого преимущества в его оборачивании в async
объект.
F # PowerPack определяет метод расширения, val webclient.AsyncDownloadString : uri -> Async{string}
:
let Download(url : Uri) =
async {
let client = new WebClient()
client.Encoding <- Encoding.GetEncoding("utf-8")
let! html = client.AsyncDownloadString(url)
return html }
К сожалению, выбор имени вступает в противоречие с существующим методом веб-клиента, что вполне может вызвать путаницу. Однако я считаю, что все асинхронные расширения F # начинаются с Async*
.
[Изменить, чтобы добавить в ответ на комментарии:]
Обычно .NET использует шаблон BeginFoo / EndFoo для параллелизма. Если типы верны, вы можете просто использовать Async.BuildPrimitive beginMethod endMethod
, который возвратит асинхронную оболочку для метода.
Иногда объекты не используют этот шаблон, например WebClient, и вам действительно нужно использовать Async.AwaitEvent
, чтобы дождаться запуска события или написать свой собственный цикл, чтобы многократно проверять, установлен ли bool. Вот хорошая статья о преобразовании событий в асинхронные объекты .
Для чего стоит, если у вас установлен F #, у вас также должен быть исходный код, который даст вам представление о том, как команда F # реализует свои асинхронные расширения. На моей машине соответствующий файл находится по адресу:
C:\Program Files\FSharp-1.9.6.16\source\fsppack\FSharp.PowerPack\AsyncOperations.fs