.NET 8 WPF应用:判断异步任务完成状态及处理并发请求
WPF异步查询冲突与任务管理方案疑问
应用背景
- 基于.NET 8开发的WPF应用,采用Microsoft Community Toolkit for MVVM、Microsoft Extensions依赖注入、EF Core框架
- 架构包含视图、视图模型(ViewModel),以及通过异步方式使用EF Core查询数据的仓储(Repo)类
- 用户操作逻辑:列表视图生成后,点击列表项触发属性变更,调用仓储中的异步方法从数据库获取对应记录
核心错误场景
当用户在前一项的异步查询完成前,快速点击新的列表项发起新查询时,会抛出EF Core错误:
A second operation was started on this context instance before a previous operation completed.
需求与疑问
已尝试调整DbContext的生命周期和服务作用域,但问题未解决(该部分将单独开线程讨论)。当前聚焦于异步任务的管理,有以下疑问:
- 如何更优雅地判断前一个异步调用是否完成,再执行新的调用?目前通过在方法内设置属性判断任务状态的方案有一定效果,但想知道是否有更优实现。
- 是否支持以下两种处理方案(两种均符合业务需求,因为用户点击新项后旧查询已无意义):
- 让新请求等待前一个任务完成后,再启动新的查询
- 直接取消前一个未完成的任务,立即启动新的查询
DbContextFactory尝试问题
尝试参考示例使用DbContextFactory优化DbContext管理,但修改App.cs和Repo代码后遇到问题:
- 初始修改后抛出依赖注入错误:
Unable to resolve service for type 'System.Func1[dbContext]' while attempting to activate 'LocalRepoWF'` - 调整服务注册方式后,又出现上下文已释放的错误:
Cannot access a disposed context instance.
相关代码片段
- App.cs(应用启动与服务注册代码)
- ViewModel(处理列表项点击、调用仓储的逻辑代码)
- Repo类(异步EF Core查询实现代码)
内容的提问来源于stack exchange,提问作者Haim Katz
相关产品推荐
相关产品推荐

