首页 > 解决方案 > 调用返回任务的 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。

标签: f#

解决方案


在 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.Startor启动异步计算Async.RunSynchronously,这类似于使用 启动任务或阻塞task.RunSynchronously


推荐阅读