F# 什么时候应该使用Async.AwaitIAsyncResult而不是Async.AwaitTask来等待任务?
使用以下调用保存更改时,我想等待Entity Framework Core返回的F# 什么时候应该使用Async.AwaitIAsyncResult而不是Async.AwaitTask来等待任务?,f#,async-await,task,f#-async,F#,Async Await,Task,F# Async,使用以下调用保存更改时,我想等待Entity Framework Core返回的任务:myDbContext.savechangesync true 我找到了至少3种不同的方法来实现这一点,但考虑到我并不真正关心任务中的int结果部分,我不确定哪种方法是最好的,最后我只想等待 使用Async.awaiiasyncresult然后使用Async.awaiiasyncresult忽略任务: async{ do!myDbContext.savechangesync true |>Async.Await
任务
:myDbContext.savechangesync true
我找到了至少3种不同的方法来实现这一点,但考虑到我并不真正关心任务中的int
结果部分,我不确定哪种方法是最好的,最后我只想等待
使用Async.awaiiasyncresult
然后使用Async.awaiiasyncresult
忽略任务
:
async{
do!myDbContext.savechangesync true
|>Async.AwaitIAsyncResult
|>异步。忽略
}
将任务
向上转换为任务
,然后使用异步等待任务
:
async{
do!myDbContext.savechangesync true
:>任务
|>异步任务
}
用Async等待Task
,用Async.Ignore忽略结果
async{
do!myDbContext.savechangesync true
|>异步任务
|>异步。忽略
}
waitiasyncresult
如果我想在等待任务时获取布尔值以防出错(和/或我想通过超时控制执行):。我还怀疑,如果我想避免在等待过程中出现错误时抛出异常,而是获取布尔值,那么这是正确的
这就剩下了另外两个解决方案,我想说的是,最后一个解决方案更好地解释了我不关心任务/Async
的int
的意图
然而,我不太确定,有人能验证或否定我的想法吗?接口IAsyncResult
是.NET异步早期的遗留版本(请记住FileStream.BeginRead
/FileStream.EndRead
),因此它仅在与遗留API交互时使用
Async.awaiiasyncresult
返回Async
这一事实并不意味着它以任何方式处理异常,事实上并非如此
因此,对于Async.AwaitIAsyncResult
,我会说您的第三个示例
async {
do! myDbContext.SaveChangesAsync true
|> Async.AwaitTask
|> Async.Ignore
}
因为意图是明确的。我看不出您的示例将如何编译,所以我希望这里没有遗漏什么
我想这就是我解决问题的方法:
从nuget package Taskbuilder.fs打开FSharp.Control.Tasks.V2//
让SomeExampleAncy(thing:bool):Threading.Tasks.Task=
任务{
printfn“这被叫来了”
返回1
}
让saveChanges():Async=someExampleAync true |>Async.waitTask
//等待一次
saveChanges()|>Async.RunSynchronously |>ignore
//等待几次
让我们重复它=
异步的{
let!awaitOnce=saveChanges()
let!waitivereach=saveChanges()
让!waitiandagain=saveChanges()
返回“全部完成”
}
repeatIt |>Async.RunSynchronously |>忽略
免责声明:我是初学者