我有以下内容:
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
}