f# - 调用返回任务的 C# 方法
问题描述
这是一些 C# 代码:
var streamStore = new PostgresStreamStore(new PostgresStreamStoreSettings("Host=localhost;Port=5432;User Id=postgres;Password=123456;Database=postgres"));
await streamStore.CreateSchemaIfNotExists();
我试图从 F# 中调用它,如下所示:
let db_connection =
Sql.host "localhost"
|> Sql.port 5432
|> Sql.username "postgres"
|> Sql.password "123456"
|> Sql.database "postgres"
|> Sql.str
let store =
new PostgresStreamStore(PostgresStreamStoreSettings(db_connection))
store.CreateSchemaIfNotExists() |> Async.AwaitTask |> ignore
代码可以编译,但是与 C# 版本相比,架构不会创建架构。我如何等待Task
这个store.CreateSchemaIfNotExists
?
我收到此错误消息:
`这个表达式是一个函数值,即缺少参数。它的类型是unit -> Tasks.Task。
解决方案
在 C# 代码中,您使用的是await
,因此它必须在async
方法内。F# 中相应的事情是使用 F# 异步工作流。在这些里面,你可以使用let!
类似于await
. 这适用于类型Async<T>
而不是Task<T>
. 操作Async.AwaitTask
变成这样您就可以使用它来访问Task<T>
它Async<T>
let!
let doSomething () = async {
let db_connection =
Sql.host "localhost"
// (other configuration omitted)
let store =
new PostgresStreamStore(PostgresStreamStoreSettings(db_connection))
let! res = store.CreateSchemaIfNotExists() |> Async.AwaitTask
return "whatever" }
我假设它CreateSchemaIfNotExists
不会返回任何有用的东西,所以你也可以等待它完成使用do!
do! store.CreateSchemaIfNotExists() |> Async.AwaitTask |> Async.Ignore
然后需要使用Async.Start
or启动异步计算Async.RunSynchronously
,这类似于使用 启动任务或阻塞task.RunSynchronously
。
推荐阅读
- ios - 使用 Alamofire 加载图像非常慢
- ssh - 将 ssh 密钥从 windows 机器复制到 windows server 2019
- javascript - 计算两个期间的百分比差异
- c# - Blazor WASM,自动更新数据更改
- deep-learning - 多类文本分类
- c - 在 C 中不能按预期工作的字符串回文函数
- python - 有人可以解释为什么我在我的 ATM python 程序中出现这个错误(TypeError: unsupported operand type(s) for -: 'float' and 'tuple')
- python - 如何更新画布大小的 tkinter 滚动条大小
- java - Нow 在科尔多瓦的 android 上启用并查看 StrictMode
- android - 制作像 Discord 这样的多平台应用程序的技巧