Я знаю синтаксис асинхронного программирования в 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 при завершении операции. затем продолжайте выполнение остальной части тела вычисления
Я также знаю, что при выполнении операции async создается новый поток. Мое первоначальное понимание заключалось в том, что после асинхронной операции есть два параллельных потока, один из которых выполняет операции ввода-вывода и один продолжает выполнять асинхронное тело одновременно.
Но в этом примере я запутался в
let! resp = req.AsyncGetResponse()
let stream = resp.GetResponseStream()
Что произойдет, если resp
еще не запущен, а поток в асинхронном теле хочет GetResponseStream
? Это возможная ошибка?
Итак, возможно, мое первоначальное понимание было неправильным. Приведенные предложения в книге экспертов F # на самом деле означают, что "создание нового потока, зависание текущего потока вверх, когда новый поток заканчивается, просыпать поток тела и продолжать", но в этом случае я не вижу, что мы могли бы сэкономить в любой момент.
В первоначальном понимании время сохраняется, когда в одном блоке асинхронных операций имеется несколько независимых операций ввода-вывода, чтобы они могли выполняться одновременно без вмешательства друг с другом. Но здесь, если я не получаю ответ, я не могу создать поток; только у меня есть поток, я могу начать читать поток. Где время?