【问题标题】:Running async computation expression in FSI在 FSI 中运行异步计算表达式
【发布时间】:2022-01-13 21:09:11
【问题描述】:

我正在尝试在 FSI 中运行此代码

#r @"C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.Http.dll"

async {
    let httpClient = new System.Net.Http.HttpClient()
    let! response = httpClient.GetAsync("") |> Async.AwaitTask
    response.EnsureSuccessStatusCode() |> ignore
    return! response.Content.ReadAsStringAsync() |> Async.AwaitTask
}

我收到以下错误

错误 FS0193:模块/命名空间“System.Threading.Tasks”来自 编译单元“System.Runtime”不包含命名空间, 模块或输入'Task`1'

但是,当我将该代码粘贴到项目的文件中时,它会按预期编译。

我错过了什么?

【问题讨论】:

    标签: f# f#-interactive


    【解决方案1】:

    我不确定您为什么会收到此错误,但您应该能够在不指定完整路径的情况下引用标准 .NET 库。

    我尝试使用以下内容创建一个 F# 脚本,它工作得非常好(我仍在使用 F# 5,但我不希望这会在新版本中发生变化):

    #r @"System.Net.Http.dll"
    
    async {
        let httpClient = new System.Net.Http.HttpClient()
        let! response = httpClient.GetAsync("http://tomasp.net") |> Async.AwaitTask
        response.EnsureSuccessStatusCode() |> ignore
        return! response.Content.ReadAsStringAsync() |> Async.AwaitTask
    }
    |> Async.RunSynchronously
    

    我只需要添加一个真实的下载 URL 和 Async.RunSynchronously 来实际运行代码。

    【讨论】:

    • 我在按照您建议的方式使用 #r 时注意到的一点是,FSI 以这种方式显示以下消息 -->Referenced 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\ System.Net.Http.dll',当我运行它的代码时!但是,当我按照我在问题 FSI 中的方式使用它时,会显示一条不同的消息 --> Referenced 'C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0 \System.Net.Http.dll',当我运行代码时出现此错误(在下一条评论中继续)
    • error FS0193: The module/namespace 'System.Threading.Tasks' from compiler unit 'System.Runtime' does not contain the namespace, module or type 'Task`1' 你知道为什么我收到了这个错误?
    • 我认为问题在于您引用的库是reference libraries,它们实际上并不包含实现——它们仅用作 API 规范。 (我从来没有完全理解这些,但我怀疑这是怎么回事!)
    • 感谢托马斯的帮助
    猜你喜欢
    • 2015-10-17
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多