c# - 使用 ASP.NET async/await 进行线程管理

标签 c# multithreading entity-framework asynchronous async-await

我有一个数据库实体类型 Entity ,一长串Thingy及方法

private Task<Entity> MakeEntity(Thingy thingy) {
  ...
}

MakeEntity 做了很多事情,并且受 CPU 限制。我想将我所有的东西转换为实体,并将它们保存在 db.context 中。考虑到

  • 我不想尽快完成
  • 实体数量很大,并且我想有效地使用数据库,因此我想开始保存更改并等待远程数据库完成该操作

我怎样才能高效地做到这一点?我真正想要的是在等待数据库执行其操作时进行循环,并提供到目前为止所有新创建的实体,直到数据库处理完所有实体。那里最好的路线是什么?如果同时调用的话,我会遇到 saveChanges 抛出的情况,所以我不能这样做。我真正想要的是拥有一个由八个线程组成的线程池(或者更确切地说,与我拥有的核心一样多的线程)来执行 CPU 密集型工作,并由一个线程执行 SaveChanges()

最佳答案

这是一种“异步流”,总是有点尴尬。

在这种情况下(假设您确实确实想要在 ASP.NET 上使用多线程,一般情况下不建议这样做),我会说 TPL Dataflow是您最好的选择。您可以将 TransformBlockMaxDegreeOfParallelism set to 8 (or unbounded, for that matter) 一起使用,并将其链接到执行 SaveChangesActionBlock

请记住,对于 CPU 绑定(bind)代码使用同步签名(而不是 async/await),对于 I/O 绑定(bind)代码使用异步方法(即 SaveChangesAsync)。

关于c# - 使用 ASP.NET async/await 进行线程管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26935077/

相关文章:

c# - 通用类型父列表不接受子类型是父列表类型的子类型

c - 如何编写检查竞争条件的测试?

.NET Entity Framework

c# - 在 EF6 和 ASP.NET 中同时使用多个 DbContext 实例

C# 将 JSON 反序列化为列表

c# - 电子邮件通知服务

c# - 如何获取此 ID

ios - 在有返回值的方法中使用@synchronized

c - 在收到 SIGINT 或 SIGTERM(C 中的 Posix 线程)后关闭服务器之前等待线程终止

c# - 脚手架标识时的 VS 错误消息