You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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的生命周期和服务作用域,但问题未解决(该部分将单独开线程讨论)。当前聚焦于异步任务的管理,有以下疑问:

  1. 如何更优雅地判断前一个异步调用是否完成,再执行新的调用?目前通过在方法内设置属性判断任务状态的方案有一定效果,但想知道是否有更优实现。
  2. 是否支持以下两种处理方案(两种均符合业务需求,因为用户点击新项后旧查询已无意义):
    • 让新请求等待前一个任务完成后,再启动新的查询
    • 直接取消前一个未完成的任务,立即启动新的查询

DbContextFactory尝试问题

尝试参考示例使用DbContextFactory优化DbContext管理,但修改App.cs和Repo代码后遇到问题:

  1. 初始修改后抛出依赖注入错误:Unable to resolve service for type 'System.Func1[dbContext]' while attempting to activate 'LocalRepoWF'`
  2. 调整服务注册方式后,又出现上下文已释放的错误:Cannot access a disposed context instance.

相关代码片段

  • App.cs(应用启动与服务注册代码)
  • ViewModel(处理列表项点击、调用仓储的逻辑代码)
  • Repo类(异步EF Core查询实现代码)

内容的提问来源于stack exchange,提问作者Haim Katz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 01:20:07