【发布时间】:2014-11-14 16:55:59
【问题描述】:
我有一个数据库实体类型Entity,一长串Thingy 和方法
private Task<Entity> MakeEntity(Thingy thingy) {
...
}
MakeEntity 做了很多事情,并且受 CPU 限制。我想将我所有的东西转换为实体,并将它们保存在 db.context 中。考虑到
- 我不想尽快完成
- 实体量大,想有效利用数据库,所以想开始保存更改,等待远程数据库做的事
我怎样才能高效地做到这一点?我真正想要的是在等待数据库执行它的操作时循环,并提供到目前为止所有新创建的实体,直到数据库处理完它们。那里最好的路线是什么?如果同时调用它,我会遇到 saveChanges 抛出,所以我不能这样做。我真正想要的是有一个由八个线程(或者更确切地说,与我拥有的内核一样多的线程)组成的线程池来执行 CPU 绑定的工作,以及一个执行 SaveChanges()
【问题讨论】:
-
您确定想要在 ASP.NET 上使用多线程吗?请记住,当单个请求使用多个线程时,这将显着影响您的可伸缩性,因为这些线程不能用于其他请求。
-
“一长串Thingy”。您是否对每个
Thingy实例重复调用MakeEntity? -
另外,有没有办法批量处理一堆
Thingys 的 CPU 绑定处理并将生成的Entitys 附加到上下文中,然后 @987654329 @ 仅用于一次 DB 往返? -
@Asad MakeEntity 应该为每个东西调用,是的(但我的问题实际上是如何的一部分。为整个批次调用一次 SaveChanges 是迄今为止最好的,但由于所需的工作量我要避免的主要事情是
MakeEntity的独立工作并等待SaveChanges的中间结果,同时注意没有多个SaveChanges 同时“飞行中”,因为EF 不支持。
标签: c# multithreading entity-framework asynchronous async-await