异步代码 + 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 与普通同步代码的主要内容,如果未能解决你的问题,请参考以下文章

unity代码热更后异步代码有问题

C#异步执行代码块

CompletableFuture异步编排(开启异步编程代码示例)

tornado中使用异步(tornado底层是使用协程写异步代码!)

前端异步代码烧脑的原因

立即从同步代码执行异步回调