После бесстыдного воровства фрагмента кода из блога Томаса Петричека:
http://tomasp.net/blog/csharp-fsharp-async-intro.aspx
В частности, этот (и несколько изменений):
let downloadPage(url:string) (postData:string) = async {
let request = HttpWebRequest.Create(url)
// Asynchronously get response and dispose it when we're done
use! response = request.AsyncGetResponse()
use stream = response.GetResponseStream()
let temp = new MemoryStream()
let buffer = Array.zeroCreate 4096
// Loop that downloads page into a buffer (could use 'while'
// but recursion is more typical for functional language)
let rec download() = async {
let! count = stream.AsyncRead(buffer, 0, buffer.Length)
do! temp.AsyncWrite(buffer, 0, count)
if count > 0 then return! download() }
// Start the download asynchronously and handle results
do! download()
temp.Seek(0L, SeekOrigin.Begin) |> ignore
let html = (new StreamReader(temp)).ReadToEnd()
return html };;
Я попытался сделать следующее с этим, и получил ошибку в последней строке:
Ожидается, что тип будет иметь тип Async<'a>
, но вместо него будет string -> Asnyc<'a>
Я погуглил ошибку, но не смог найти ничего, что выявило бы мою конкретную проблему.
let postData = "userid=" + userId + "&password=" + password + "&source=" + sourceId + "&version=" + version
let url = postUrlBase + "100/LogIn?" + postData
Async.RunSynchronously (downloadPage(url, postData));;
Кроме того, как бы я изменил код так, чтобы он загружал несинхронный поток байтов (но со случайными паузами между каждым пакетом байтов) асинхронно вместо строки? Как бы я интегрировал чтение этого потока байтов по мере его поступления? Я понимаю, что это больше, чем один вопрос, но, поскольку все они тесно связаны, я решил, что один вопрос сэкономит время.
Заранее спасибо,
Bob
P.S. Поскольку я все еще новичок в F #, пожалуйста, не стесняйтесь вносить любые изменения / предложения в мой код, который показывает, как это делается в более функциональном стиле. Я действительно пытаюсь избавиться от своего мышления в C #, поэтому я ценю любые советы, которыми кто-то может поделиться.
Редактировать: Я случайно вставил неправильный фрагмент, который я использовал. Я внес изменения в фрагмент Томаса и забыл об этом.