Async的问题.顺序,f#



我有以下内容:

do!
[
[
TradesDatabase.deleteTradesAsync    credentials time (time.Add oneDay)
TradesDatabase.insertTradesAsync    credentials trades
] |> Async.Sequential

[
KVWAPDatabase.deleteKVWAPAsync      credentials time (time.Add oneDay)
KVWAPDatabase.insertKVWAPAsync      credentials output.KVWAP
] |> Async.Sequential

[
CandlesDatabase.deleteCandlesAsync  credentials time (time.Add oneDay)
CandlesDatabase.insertCandlesAsync  credentials output.Candles
] |> Async.Sequential
]
|> Async.Parallel
|> Async.Ignore

内部代码可能不是很有用,这些是异步db调用。

因此,对于我想并行处理的3种数据类型,我想在插入之后执行顺序删除。

但是调试输出是:

delete kvwap              <- called by deleteKVWAPAsync
inserting kvwap           <- called by insertKVWAPAsync
done deleting kvwap       <- called by deleteKVWAPAsync

所以这个block:

[
KVWAPDatabase.deleteKVWAPAsync      credentials time (time.Add oneDay)
KVWAPDatabase.insertKVWAPAsync      credentials output.KVWAP
] |> Async.Sequential

应该按顺序执行,但事实并非如此。

关于异步顺序,我错过了什么?

我也遇到过类似的问题。

可能是您的数据库函数以"hot"方式运行的情况。任务。例如,如果我没记错的话,下面的代码立即开始计算,即使它返回的是Async<int>:

type DbContext =
Microsoft.Data.SqlClient.SqlConnection * Microsoft.Data.SqlClient.SqlTransaction
let doQuery ((connection, transaction) : DbContext) query =
(connection.ExecuteAsync(query, transaction))
|> Async.AwaitTask

let doQuery2 ((connection, transaction) : DbContext) query =
async {
return! 
(connection.ExecuteAsync(query, transaction))
|> Async.AwaitTask
}

最新更新