后无耻地从托马斯Petricek的博客顺手牵羊的代码片段: http://tomasp.net/blog/csharp-fsharp-async-intro.aspx 具体来说,这一个(和进行了一些改建的话):F# - 类型预计有型异步<'a>但字符串 - > Asnyc <'a>代替
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>
,而不是
我GOOGLE了错误,但找不到任何显示我的特定问题。
let postData = "userid=" + userId + "&password=" + password + "&source=" + sourceId + "&version=" + version
let url = postUrlBase + "100/LogIn?" + postData
Async.RunSynchronously (downloadPage(url, postData));;
而且,我会如何修改代码,以便它下载一个非结束字节流(但有个字节的每个突发之间偶尔的暂停),异步,而不是一个字符串?读取该字节流时,我将如何进行整合?我意识到这不仅仅是一个问题,但由于它们都是密切相关的,我认为一个问题会节省一些时间。
由于提前,
鲍勃
附:由于我还是F#的新手,请随时对我的代码进行任何修改/建议,以显示它如何以更实用的方式完成。我真的想摆脱我的C#心态,所以我很欣赏任何人都希望分享的指针。
编辑:我不小心粘贴了我正在使用的错误代码段。我确实改变了Tomas的片段并忘记了它。
我不小心粘贴了我正在使用的错误代码段。我确实改变了Tomas的片段并忘记了它。既然你是唯一一个给它一个镜头的人,可以随意改变你的答案,像我在下面发布的东西,我会给你。如果这个问题没有得到回答,那么回答我自己的问题就会有些阴暗。 :) – Beaker 2011-04-04 16:02:22
@Beaker:你走了,也解释了这种差异,包括我在首次提交时收到并引用的不同错误背后的逻辑。 – Guvante 2011-04-04 16:25:53
谢谢,并为最初的错误感到抱歉。 – Beaker 2011-04-04 20:09:38