我希望SaveChanges
(Win应用)的ObjectContext
异步保存更改,为用户显示一个选取框(或可控制的?)进度条(我可以轻松实现)能够继续工作。
我基本上想要覆盖SaveChanges
的{{1}}。
以前有人想过这个吗?
答案 0 :(得分:3)
实体框架本身目前不支持异步操作。主要是因为它建立在ADO.NET之上,也不支持。默认情况下,ADO.NET甚至不是线程安全的。
您可以使用上面的委托方法或将其包装到Task中。但即使提供者支持,也不会使用任何异步调用。此外,在“后台”操作期间,您不应对ObjectContext(查询,添加对象,......)执行任何操作,否则可能会导致状态损坏。
与多线程相关,您可以阅读this帖子。它比较旧,但想法仍然有效。
编辑2013-04-17:
EF6(下一个版本,目前处于编写时的alpha阶段)将支持异步操作,即您请求的SaveChangesAsync
。它还扩展了ADO.NET模型,所以如果提供者本身支持异步执行,它将是异步的(否则回到以前的行为,因为没有什么比这更好(明智)了。)
答案 1 :(得分:2)
在2013-03-12编辑:
由于有些人开始拒绝这个答案,我想,由于某种原因,这个解决方案已经不再好了。
请不要因为这个原因而拒绝回答。总是先写一个温和的评论,说明为什么你不喜欢这个答案。
我相信您需要使用Asynchronous Delegates。它基本上是这样的:
您可以从要异步调用的方法创建委托;
您拨打代理人BeginInvoke
,开始通话;
你做任何你需要做的事情(例如为一个选框设置动画);
您可以等待异步调用完成,或者检查是否已完成,如果不是,则保持动画显示;