我有一个数据库实体类型 Entity
,一长串Thingy
及方法
private Task<Entity> MakeEntity(Thingy thingy) {
...
}
MakeEntity 做了很多事情,并且受 CPU 限制。我想将我所有的东西转换为实体,并将它们保存在 db.context 中。考虑到
- 我不想尽快完成
- 实体数量很大,并且我想有效地使用数据库,因此我想开始保存更改并等待远程数据库完成该操作
我怎样才能高效地做到这一点?我真正想要的是在等待数据库执行其操作时进行循环,并提供到目前为止所有新创建的实体,直到数据库处理完所有实体。那里最好的路线是什么?如果同时调用的话,我会遇到 saveChanges 抛出的情况,所以我不能这样做。我真正想要的是拥有一个由八个线程组成的线程池(或者更确切地说,与我拥有的核心一样多的线程)来执行 CPU 密集型工作,并由一个线程执行 SaveChanges()
最佳答案
这是一种“异步流”,总是有点尴尬。
在这种情况下(假设您确实确实想要在 ASP.NET 上使用多线程,一般情况下不建议这样做),我会说 TPL Dataflow是您最好的选择。您可以将 TransformBlock
与 MaxDegreeOfParallelism
set to 8 (or unbounded, for that matter) 一起使用,并将其链接到执行 SaveChanges
的 ActionBlock
。
请记住,对于 CPU 绑定(bind)代码使用同步签名(而不是 async
/await
),对于 I/O 绑定(bind)代码使用异步方法(即 SaveChangesAsync
)。
关于c# - 使用 ASP.NET async/await 进行线程管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26935077/