Почему Asyn c .Sequential не работает должным образом (но работает в FSI)? - PullRequest
3 голосов
/ 17 марта 2020
open System
open System.Net

let fetchUrlAsync url = 
    async {
        Console.WriteLine(sprintf "Fetch <%s>" url)
        let req = WebRequest.Create(Uri(url)) 
        use! resp = req.AsyncGetResponse()   
        use stream = resp.GetResponseStream() 
        use reader = new IO.StreamReader(stream) 
        let html = reader.ReadToEnd() 
        Console.WriteLine(sprintf "finished downloading %s. Length = %i" url html.Length)
    }

[<EntryPoint>]
let main argv =
    ["http://bing.com"; "http://ya.ru"; "http://google.com"]
    |> List.map fetchUrlAsync
    |> Async.Sequential
    |> Async.Ignore
    |> Async.RunSynchronously


Вывод:

Fetch <http://bing.com>
Fetch <http://ya.ru>
Fetch <http://google.com>
finished downloading http://google.com. Length = 50592
finished downloading http://ya.ru. Length = 20541
finished downloading http://bing.com. Length = 81386

Я не ожидаю такого вывода (но, возможно, я ошибаюсь в своих ожиданиях). Но если я запускаю один и тот же код в интерактивном режиме F #, то получается (как я и ожидал):

Fetch <http://bing.com>
finished downloading http://bing.com. Length = 81386
Fetch <http://ya.ru>
finished downloading http://ya.ru. Length = 20544
Fetch <http://google.com>
finished downloading http://google.com. Length = 50561

Почему код работает по-разному при запуске из Rider (консольное приложение) и из F # Interactive? Если первый вывод правильный, то в чем разница между Asyn c .Sequential и Asyn c .Parallel? Если первый вывод неверен, то как это исправить?

1 Ответ

5 голосов
/ 17 марта 2020

В настоящее время Async.Sequential просто реализовано следующим образом:

static member Sequential computations = 
    Async.Parallel(computations, maxDegreeOfParallelism=1)

Хотя RF C позволяет это , ожидается, что он будет работать последовательно. Это было обнаружено как ошибка . И это было исправлено # 7596 .

Исправление теперь поставляется только на VS. Но его пока нет в основной ленте FSharp.Core nuget.

Единственный способ получить исправление в настоящий момент - через VS2019 16.4 FSI.

Вот почему вы видите, что оно работает правильно в FSI, а не в скомпилированном приложение.

Решение

Наберите # 7956 и дождитесь его отправки.

...