在使用以下调用保存更改时,我想等待 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/