异步代码 + Async.RunSynchronously 与普通同步代码
Posted
技术标签:
【中文标题】异步代码 + Async.RunSynchronously 与普通同步代码【英文标题】:Async code + Async.RunSynchronously vs. plain synchronous code 【发布时间】:2013-10-24 17:39:14 【问题描述】:如果我有这样的代码:
let asyncReadToEnd (stream:Stream) = async
// Allocate 4kb buffer for downloading data
let buffer = Array.zeroCreate (4 * 1024)
use output = new MemoryStream()
let reading = ref true
while reading.Value do
// Download one (at most) 4kb chunk and copy it
let! count = stream.AsyncRead(buffer, 0, buffer.Length)
output.Write(buffer, 0, count)
reading := count > 0
// Read all data into a string
output.Seek(0L, SeekOrigin.Begin) |> ignore
use sr = new StreamReader(output)
return sr.ReadToEnd()
use stream = httpResponse.GetResponseStream()
asyncReadToEnd stream |> Async.RunSynchronously
与单纯的做相比,我有什么收获吗
use stream = httpResponse.GetResponseStream()
use sr = new StreamReader(stream)
sr.ReadToEnd()
在这两种情况下,我都会阻塞当前线程,但在使用第一个版本释放线程资源方面还有什么优势吗?
【问题讨论】:
这是一个有趣的问题 :-)。我不认为你有任何收获......事实上,你现在有一个异步版本的函数,如果你真的需要异步做事情,你可以在其他地方使用它。 你的代码只是CopyToAsync
的重写。
@Daniel,是的我现在,但我需要它,因为这是用于 .NET 4.0
@TomasPetricek 即使在异步情况下,您也只能在消耗完整个流之后才能继续计算,那么在这种情况下您实际上有什么收获吗?
在异步情况下,这很重要,因为您可以例如执行Async.Parallel
并运行 n 次下载而不阻塞 n 个线程。要做到更多,你需要asyncSeq
: tomasp.net/blog/async-sequences.aspx
【参考方案1】:
只要您在每个async
工作流程上使用Async.RunSynchronously
,您就什么也得不到。您需要编写一个完全异步的程序来利用它。这样你就可以同时做10000个了。
【讨论】:
以上是关于异步代码 + Async.RunSynchronously 与普通同步代码的主要内容,如果未能解决你的问题,请参考以下文章
CompletableFuture异步编排(开启异步编程代码示例)