为什么 Async.Sequential 不能按预期工作(但在 FSI 中工作)?


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上运行时表现不同?如果第一个输出是正确的,那么Async.Sequential和Async.Parallel之间有什么区别?如果第一个输出不正确,那么如何修复?

目前,Async.Sequential刚刚实现为:

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

尽管RFC允许这样做,但它应该按顺序运行。它被发现是一个bug。它已经被#7596修复。

该修复程序现在只在VS上发布。但它还没有在主线FSharp.Corenuget提要中。

目前获得修复的唯一方法是通过VS2019 16.4 FSI。

这就是为什么您可以看到它在FSI中正常工作,但在您编译的应用程序中却不能。

解决方案

观看#7956,等待它发货。

相关内容

  • 没有找到相关文章

最新更新