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

标签 f# async-await task f#-async

我想等待 Task<int>使用以下调用保存更改时由 Entity Framework Core 返回:myDbContext.SaveChangesAsync true
我找到了至少 3 种不同的实现方式,但我不确定哪一种是最好的,因为我并不真正关心 int结果部分在 Task<int> ,在一天结束时,我只想等待。

使用 Async.AwaitIAsyncResult然后 Async.AwaitIgnore忽略 Task<bool> :

async {
    do! myDbContext.SaveChangesAsync true
    |> Async.AwaitIAsyncResult
    |> Async.AwaitIgnore
}

上投Task<int>Task然后就在等待 TaskAsync.AwaitTask :

async {
    do! myDbContext.SaveChangesAsync true
    :> Task
    |> Async.AwaitTask
}

等待 Task<int>Async.AwaitTask并忽略 Async.Ignore 的结果

async {
    do! myDbContext.SaveChangesAsync true
    |> Async.AwaitTask
    |> Async.Ignore
}
AwaitIAsyncResult如果我想在等待任务时出现错误时获取一个 bool 值似乎更相关(和/或我想通过超时对执行进行一些控制):https://msdn.microsoft.com/en-us/visualfsharpdocs/conceptual/async.awaitiasyncresult-method-%5Bfsharp%5D?f=255&MSPPError=-2147217396 .我也怀疑如果我想避免在等待时出现问题时向我的脸上抛出异常,而是获取一个 bool 值,这是正确的。

然后剩下两个其他解决方案,我想说最后一个解决方案更好地表达了我不关心 int 的意图。的 Task<int>/Async<int> .

但是我不太确定,有人可以验证或否定我的想法吗?

最佳答案

界面 IAsyncResult是 .NET 上异步早期的遗留物(请记住 FileStream.BeginRead/FileStream.EndRead ),因此它仅在与遗留 API 互操作时使用。

事实Async.AwaitIAsyncResult返回 Async<bool>并不意味着它以任何方式处理异常,事实上它没有。

所以与 Async.AwaitIAsyncResult顺便说一句,我会说你的第三个例子

async {
    do! myDbContext.SaveChangesAsync true
    |> Async.AwaitTask
    |> Async.Ignore
}

是要走的路,因为意图是明确的。

关于f# - 我什么时候应该使用 Async.AwaitIAsyncResult 而不是 Async.AwaitTask 来等待任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57225578/

相关文章:

c# - 在关闭表单之前等待任务完成

database - 简约的数据库管理

f# - 在 F# 中使用 %A 格式时是否可以配置显示的列表项的数量?

javascript - F# 中原型(prototype)的 Enumerable#pluck?

.net - 分发 F# 应用程序(启动时崩溃)

plugins - 在Gradle中测试增强的任务和自定义插件的更好方法是哪种?

c# - 对于 .NET 和命令式 OO,是否有比 C# 更简洁(如在 F# 中)的替代方案?

c# - 异步和等待 - 如何维护执行顺序?

c# - Entity Framework 中的 SaveChanges 与 SaveChangesAsync

c# - 异步数据读取器和执行顺序