【发布时间】:2010-03-15 21:57:49
【问题描述】:
我有点了解 F# 中异步编程的语法。例如
let downloadUrl(url:string) = async {
let req = HttpWebRequest.Create(url)
// Run operation asynchronously
let! resp = req.AsyncGetResponse()
let stream = resp.GetResponseStream()
// Dispose 'StreamReader' when completed
use reader = new StreamReader(stream)
// Run asynchronously and then return the result
return! reader.AsyncReadToEnd() }
在 F# 专家书籍(和许多其他来源)中,他们说像
让! var = expr 仅表示“执行异步操作 expr 并在操作完成时将结果绑定到 var。然后 继续执行计算体的其余部分”
我也知道执行异步操作时会创建一个新线程。我原来的理解是异步操作后有两个并行线程,一个做I/O,一个同时继续执行异步体。
但在这个例子中,我很困惑
let! resp = req.AsyncGetResponse()
let stream = resp.GetResponseStream()
如果resp 还没有启动并且异步主体中的线程想要GetResponseStream 会发生什么?这可能是错误吗?
所以也许我最初的理解是错误的。 F#专家书中引用的句子实际上是“创建一个新线程,将当前线程挂起,当新线程完成时,唤醒主体线程并继续”,但在这种情况下我看不到我们可以保存任何时候。
原来的理解是,在一个异步块中有多个独立 IO操作可以同时进行而不相互干预,这样可以节省时间。但是在这里,如果我没有得到响应,我就无法创建流;只有我有流,我可以开始阅读流。哪来的时间?
【问题讨论】:
-
我写的一篇博文可能会有所帮助:blogs.lessthandot.com/index.php/DesktopDev/MSTech/…
-
感谢 ChaosPandion!但是我的 C# 知识是 C++ + 几个 .Net 集合....
-
这就是我将其作为评论发布的原因。希望托马斯会出现。
标签: f# asynchronous