异步ObjectContext.SaveChanges()?

时间:2009-07-23 13:22:08

标签: entity-framework asynchronous backgroundworker savechanges objectcontext

我希望SaveChanges(Win应用)的ObjectContext异步保存更改,为用户显示一个选取框(或可控制的?)进度条(我可以轻松实现)能够继续工作。

我基本上想要覆盖SaveChanges的{​​{1}}。

以前有人想过这个吗?

2 个答案:

答案 0 :(得分:3)

实体框架本身目前不支持异步操作。主要是因为它建立在ADO.NET之上,也不支持。默认情况下,ADO.NET甚至不是线程安全的。

您可以使用上面的委托方法或将其包装到Task中。但即使提供者支持,也不会使用任何异步调用。此外,在“后台”操作期间,您不应对ObjectContext(查询,添加对象,......)执行任何操作,否则可能会导致状态损坏。

与多线程相关,您可以阅读this帖子。它比较旧,但想法仍然有效。

编辑2013-04-17:

EF6(下一个版本,目前处于编写时的alpha阶段)将支持异步操作,即您请求的SaveChangesAsync。它还扩展了ADO.NET模型,所以如果提供者本身支持异步执行,它将是异步的(否则回到以前的行为,因为没有什么比这更好(明智)了。)

答案 1 :(得分:2)

在2013-03-12编辑:

由于有些人开始拒绝这个答案,我想,由于某种原因,这个解决方案已经不再好了。

请不要因为这个原因而拒绝回答。总是先写一个温和的评论,说明为什么你不喜欢这个答案。


我相信您需要使用Asynchronous Delegates。它基本上是这样的:

  1. 您可以从要异步调用的方法创建委托;

  2. 您拨打代理人BeginInvoke,开始通话;

  3. 你做任何你需要做的事情(例如为一个选框设置动画);

  4. 您可以等待异步调用完成,或者检查是否已完成,如果不是,则保持动画显示;