Consider the following two ways of constructing an Async computation that calculates 1 + 2:
let c1 =
async {
let a = 1
let b = 2
return a + b }
let c2 =
async {
let a = 1
let! b = async { return 2 }
return a + b }
What is the practical difference between them? It seems to me that they do the same thing. Why, for example, would you ever need to use let! result = streamReader.ReadToEndAsync () rather than let result = streamReader.ReadToEnd ()? Isn't it the case that both lines are "blocking" when the computation is run?