F# http下载到带有fsharp.data.dll的磁盘和异步工作流暂停

F# http下载到带有fsharp.data.dll的磁盘和异步工作流暂停,f#,f#-data,F#,F# Data,下面的.fsx文件应该使用Fsharp.Data.dll下载并保存到磁盘二进制表基文件,这些文件作为链接发布在internet上的html页面中 发生的情况是,整个过程在完成之前停滞了一段时间,甚至没有抛出异常或类似的异常 我敢肯定,我在异步工作流中有点处理不当了CopyToAsync()之类的东西。因为这应该是在我小睡的时候运行的,如果有人能告诉我应该如何正确地执行,那就太好了。(更一般地说,如何在异步工作流中处理System.Threading.Task内容?) 注意更新了代码,因此它一次创

下面的.fsx文件应该使用
Fsharp.Data.dll
下载并保存到磁盘二进制表基文件,这些文件作为链接发布在internet上的html页面中

发生的情况是,整个过程在完成之前停滞了一段时间,甚至没有抛出异常或类似的异常

我敢肯定,我在异步工作流中有点处理不当了
CopyToAsync()
之类的东西。因为这应该是在我小睡的时候运行的,如果有人能告诉我应该如何正确地执行,那就太好了。(更一般地说,如何在异步工作流中处理System.Threading.Task内容?)

注意更新了代码,因此它一次创建两批下载,并且只有第一批可以工作。还添加了来自第一个答案的等待任务,因为这似乎是正确的方法

新闻有趣的是:如果我中断暂停的脚本,然后再次将其加载到同一个fsi.exe实例中,它会立即暂停。我开始认为这是我使用的库中的一个bug或者类似的东西


提前谢谢

此处已修改fetchAndSave以处理从CopyToAsync异步返回的任务。在您的版本中,您正在同步等待任务。当您使用Async.RunSynchronously运行整个工作流时,脚本将显示为锁定。但是,文件确实会在后台按预期进行下载

let awaitTask = Async.AwaitIAsyncResult >> Async.Ignore

let fetchAndSave (s,t) = async {
    let! result = Http.AsyncRequestStream(s)
    use fileStream = new System.IO.FileStream(t,System.IO.FileMode.Create)
    do! awaitTask (result.ResponseStream.CopyToAsync(fileStream))
}
当然你也需要打电话

do download()

在脚本的最后一行,我想这是正确的答案,但在完成两个文件后,它仍然会暂停。网络流量回到“零”并且没有进展。您可能需要在fetchAndSave中处理异常。如果出现异常,是否会在fsi环境中导致某种形式的转储?我现在更改了代码,将要并行下载的许多文件更改为仅N次下载的批处理。即使在那里,只有第一批2个文件可以工作,下一批永远不会真正“开始”。我试着使用浏览器,看看链接是否有效。浏览器开始下载…->相应地更新我的代码。如果有人仍然对2下载部分感到疑惑。它与.Net ServicePointManager有关。默认情况下,它将连接数限制为2,但可以使用
System.Net.ServicePointManager.DefaultConnectionLimit覆盖
do download()