3

我想ObjectContext(赢的应用程序)的SaveChanges异步保存更改,将显示一个选取框(或可控?)进度条(这个我可以很容易地实现)的用户,而他能继续工作。Asynchronous ObjectContext.SaveChanges()?

我基本上要覆盖ObjectContextSaveChanges

以前有没有人想过这个?

+0

您应该将此问题标记为* .net *。这会增加可见性,并且您可能会得到更多答案。 – jpbochi 2009-08-04 14:11:03

+0

不幸的是,没有超过5个标签的地方。 我认为其他标签已经是.net。 – Shimmy 2009-12-31 07:59:05

回答

2

编辑在2013年3月12日:

由于一些人开始downvote这个答案,我想的是,由于某种原因,这个解决方案是不好了。

请不要因此而降低答案。总是从一个温和的评论开始,说你为什么不喜欢答案。我想你需要使用Asynchronous Delegates。它基本上可以这样工作:

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

  2. 您对委托调用BeginInvoke,开始呼叫;

  3. 你做你需要做的(例如动画选取框)任何其他人;

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

+4

我知道这个问题(和答案)是相当古老的,但我偶然发现它,我想我会添加一些东西:你的解决方案不是很有趣的资源明智。我们希望在DB调用期间使用异步模式来允许当前线程在IO操作期间被释放(并且最终被重用)。如果使用委托,它将从阻塞IO操作(SaveChange)时将被阻塞的线程池中启动一个线程。这意味着性能明智的异步委托在这种情况下是无用的:不要在Web服务器上使用此实现。 – Eilistraee 2011-01-30 17:54:31

3

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

您可以使用上面的代理方法或将其包装到Task中。但即使提供者支持它,也不会使用任何异步调用。在这个“背景”操作期间,您也不应该对ObjectContext(查询,添加对象,...)做任何事情,因为这可能会导致错误的状态。

相关的多线程您可以阅读this岗位。年龄较大,但想法仍然有效。

编辑2013年4月17日:

EF6(下一个版本,目前在写本新闻时alpha阶段)将支持异步操作,即你的要求SaveChangesAsync。它还扩展了ADO.NET模型,所以如果提供者本身支持异步执行,它将会非常异步(否则回到以前的行为,因为没有什么更好的做法)。

相关问题