F# 什么时候应该使用Async.AwaitIAsyncResult而不是Async.AwaitTask来等待任务?

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

使用以下调用保存更改时,我想等待Entity Framework Core返回的
任务
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 |>忽略
免责声明:我是初学者