gpt4 book ai didi

c# - 取消长时间运行的 Entity Framework 6 异步请求

转载 作者:行者123 更新时间:2023-11-30 12:57:58 30 4
gpt4 key购买 nike

我在 WPF 应用程序中使用 Entity Framework 6 (DbContext),我想找到一种方法来正确取消 async 数据加载方法 ( ToListAsync & FirstOrDefaultAsync) 这样我就可以立即开始另一个请求。

我一直在努力坚持每个表单(在我的例子中是选项卡)标准的单一上下文,到目前为止,我一直在通过确保禁用 UI 来处理这些调用的非线程安全性质在请求期间,因此用户无法在处理过程中启动任何新请求。但是,我现在遇到了一个用例,这是不可能的。我需要在一些长时间运行的请求期间保持 UI 响应,为此,我需要一种方法来取消当前请求并立即启动另一个请求。

我尝试利用添加到 Async 方法的 CancellationToken 支持,但我发现当我取消请求时,它实际上并没有取消任何东西。它会正确抛出 OperationCanceledException,但请求仍在进行中,当我尝试在此之后发出另一个请求时,我仍然得到 NotSupportedException(第二个操作在此上下文中启动.. .)

我正在使用更改跟踪,因此更改应用程序以对每个请求使用新的上下文是不现实的。

另外,我暂时解决了这个问题,方法是处理当前上下文并在每次此特定 View 模型发出请求时创建一个新上下文,而某个请求已经在进行中。这在技术上解决了我的问题,但我想知道是否有办法在保持相同上下文的同时做到这一点。

那么,有人有这方面的经验吗?我很难相信我是第一个遇到这个问题的人,但我在这里找到的所有其他类似问题的答案都建议我使用 CancellationToken(这不起作用正确)或有点旧,不适用于 Async 方法。

编辑 1:

由于还没有人回答这个问题,我真的开始想知道我在这里有什么选择。一点背景。我正在将 Silverlight 应用程序转换为 WPF。Silverlight 应用程序使用带有 EF 4.1 的 WCF RIA 服务,但对于 WPF 应用程序,我们决定只使用 EF6.1。

使用 Silverlight 和 WCF,您一次可以进行的异步调用的数量没有限制,而且我们实际上对整个应用程序只有一个上下文(我知道这很糟糕,但是很简单,我们从来没有遇到过任何问题) .我们只是直接绑定(bind)到实体,并使用更改跟踪来保存用户所做的更改。

在现实世界的应用程序中,使用 EF 6.1 和 Async 方法,在 WPF 中是否没有办法做到这一点,有时,您只需要取消应用程序正在进行的操作在不崩溃和烧毁的情况下做用户想做的事?

最佳答案

暂时发布我的解决方案。我不是 super 粉丝,但我已经能够开始工作,不需要从头开始完全重写这个应用程序。

我现在正在使用 AsyncEx 中的 AsyncLock 类在访问或保存跟踪实体的存储库方法中。每个 DbContext 对象都使用自己的锁,因此我不会阻止来自其他上下文或未跟踪实体的其他调用。

例如,我的存储库中的 GetListAsync 方法:

public async virtual Task<IList<T>> GetListAsync(IDbContext context,
Expression<Func<T, bool>> where,
IOrderByClause<T>[] orderBy = null,
params Expression<Func<T, object>>[] navigationProperties)
{
using (await context.ContextLock.LockAsync())
{
IList<T> list = await GetListQuery(context, where, orderBy, navigationProperties).ToListAsync();
return list;
}
}

GetListQuery 使用导航属性以及 where 和 order by 子句创建查询。

我可能还会使用 CancellationToken 添加超时。

关于c# - 取消长时间运行的 Entity Framework 6 异步请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32016500/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com