在使用以下调用保存更改时,我想等待 Entity Framework Core 返回的 Task<int>: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 ,然后用 Task 等待 Async.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 接口(interface)是 .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/

10-11 22:35
查看更多