异步 ObjectContext.SaveChanges()?

发布于 2024-07-27 20:47:52 字数 211 浏览 9 评论 0原文

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

我基本上想重写ObjectContextSaveChanges

以前有人考虑过这个问题吗?

I want the SaveChanges of the ObjectContext (Win apps) to save changes asynchronously, will show a marquee (or controllable?) progress bar (this I can easily implement) for the user while he is able to continue working.

I basically want to override the SaveChanges of the ObjectContext.

Has anyone thought about this before?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

浮光之海 2024-08-03 20:47:52

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

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

与多线程相关,您可以阅读这篇帖子。 它已经很老了,但想法仍然有效。

编辑 2013-04-17:

EF6(下一个版本,在撰写本文时目前处于 alpha 阶段)将支持异步操作,即您请求的 SaveChangesAsync。 它还扩展了 ADO.NET 模型,因此如果提供程序本身支持异步执行,那么它将是真正的异步(否则回到以前的行为,因为没有更好(明智)的事情可做)。

Entity Framework itself currently does not support asynchronous operations. Mainly because it's built on top of ADO.NET where this isn't supported either. ADO.NET isn't even thread safe by default.

You can use the delegate approach above or wrap it into Task. But that will not use any async calls even if the provider supports it. Also during this "background" operation you should not do anything with the ObjectContext (querying, adding objects, ...) as may result in corrupted state.

Related to multithreading you can read this post. It's older, but ideas are still valid.

Edit 2013-04-17:

EF6 (the next version, currently in alpha stage in time of writing) will support asynchronous operations, namely your requested SaveChangesAsync. It also extended ADO.NET model, so if the provider itself supports asynchronous execution it will be really asynchronous (else back to former behavior as there's nothing better (wise) to do).

祁梦 2024-08-03 20:47:52

警告:下面的答案是旧的,可​​能不适用于相关框架的最新版本。

我相信您需要使用异步委托。 它的工作原理基本上是这样的:

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

  2. 您在委托上调用 BeginInvoke,开始调用;

  3. 您可以做任何您需要做的事情(例如为字幕设置动画);

  4. 您可以等待异步调用完成,或者检查是否已完成,如果尚未完成,则继续为选取框添加动画;

Warning: The answer below is old and may not apply to the most recent versions of the framework in question.

I believe you need to use Asynchronous Delegates. It basically works like that:

  1. You create a delegate from the method you want to call asynchronously;

  2. You call BeginInvoke on the delegate, starting a call;

  3. You do whatever else you need to do (e.g. animate a marquee);

  4. You can either wait for the async call to finish, or check whether is has completed and keep animating the marquee if it isn't;

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文