【问题标题】:Parallelism in Entity Framework allowable?实体框架中的并行性允许吗?
【发布时间】:2022-01-03 08:36:25
【问题描述】:

我可以执行以下操作吗?

DbContext context = ...

var task1 = (
  from x in context.blah1 ...
  ...
  select x.alice
).ToListAsync();

var task2 = (
  from y in context.blah2 ...
  ...
  select y.bob
).ToListAsync();

task1.Start();
task2.Start();

// Some more stuff here

var result1 = await task1;
var result2 = await task2;

这两个请求是否并行执行?或者这很淘气?如果它很淘气,为什么它很淘气?这会导致运行时异常或其他问题吗?

我读到上下文不是线程安全的,但这里只有一个线程,因为 async/await 不会产生新线程,所以我看不出这是个问题。

如果我希望请求在// Some more stuff here 之前开始运行,是否还需要调用.Start()?还是.ToListAsync() 自己开始执行?

【问题讨论】:

标签: c# .net entity-framework async-await


【解决方案1】:

不,您不能在多个线程中使用一个上下文,因为其所有用于维护状态的内部集合都不是线程安全的。他们不是故意这样做的,因为这会减慢状态管理的速度。上下文不应该长期存在并且存在于多个线程上。它们应该是短暂的,只能完成单一的工作。

【讨论】:

  • 我的问题中没有多个线程。没有Thread.Run
  • @Clinton 由于使用了更高级别的线程 API(即 async/await、Task),因此代码中没有可见的 Thread。实际上使用了多个线程,因为一旦对数据库的 I/O 完成,后续代码就可以从池中运行不同的线程
  • Task.Start 是多线程的,因为任务将在不同的线程上运行。它使用线程池。每个异步任务都可以在不同的线程上运行,然后调用线程,这就是异步的全部意义。
猜你喜欢
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多