【问题标题】:Entity Framework - Saving results to the database asyncronously实体框架 - 将结果异步保存到数据库
【发布时间】:2013-01-06 04:10:19
【问题描述】:

我有一个 web 服务,每隔几秒就会调用一次,它会做很多事情,然后执行批量插入,目前平均需要半秒来调用 SaveChanges()。我想异步保存所有更改,因为这样我可以每秒多次调用我的 Web 服务,并且只需缓冲要由石英计时器保存的任何数据库更改,这应该会带来更好的性能。

我观察到,在执行 Web 服务函数后,如果没有在实体数据库模型对象上调用“SaveChanges”,则任何未决的数据库更改都将被回滚。

我是否可以将我的更改异步保存到数据库中,我将如何去做?

【问题讨论】:

  • PS:我打算使用quartz.net在异步计时器上调用保存更改,但我愿意接受建议。

标签: c# entity-framework


【解决方案1】:

原则上,您可以使用 .NET 中可用的任何异步方法来实现此目的。如果您可以使用 .NET 4.5,那么我建议您查看 async/await 方法,因为它们非常易于使用。实体框架不支持开箱即用的 async/await,但您可以使用 TaskCompletionSource 类添加简单的包装器。

【讨论】:

  • 如果我使用这些方法中的任何一种,我的实体更改会在网络服务线程完成后立即恢复吗?
  • 如果您在 ASP.NET 中使用 await 关键字,则在所有等待的任务完成之前,您的线程实际上不会完成。所以你根本不应该有这样的问题。看看这个公认的答案:stackoverflow.com/questions/11777978/asp-net-async-await-part-2
  • 嗯,这可能是个问题 - Web 服务调用似乎在短时间内超时。检查我的应用程序的日志,我收到很多异常说明“线程被中止”,这是我异步执行数据库事务的动机。
  • 使用 async/await 模式不应该是这种情况,因为等待任务的线程被 ASP 运行时重用。请检查我提供的链接!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多