Task.Factory.StartNew和新的Thread()之间有什么区别.Start()?

时间:2014-04-22 10:05:16

标签: c# multithreading entity-framework task-parallel-library task

我有一个DbContext(Entity Framework 6.0)和1,000个对象。

对于每个对象,我开始将其保存到数据库中或使用相同的DbContext使用单独的线程/任务更新其数据。

这就是我得到的:

  • 对于thread:EntityCommandExecutionException - 已经有一个与此Command关联的打开DataReader,必须先关闭它。此异常发生在第二个thead启动后。
  • 任务:一切都很好。添加/更新所有对象。

据我所知,由于使用相同的DbContext对象和多次调用,所以我得到了线程的异常。但我不确定。

问题:为什么我在这里通过线程获得差异和异常?

我对任务和TPL库了解不多。我之前使用Thread进行过几个小规模的项目。

1 个答案:

答案 0 :(得分:1)

  • Task.Factory.StartNew :启动将在线程池线程中运行的新任务,或者可以在同一线程中运行。如果它在线程池线程中运行,则完成后线程将返回到池中。线程创建/销毁是一个昂贵的过程。

  • 新主题()。开始():将始终在新主题中运行,因此,它更贵。

该异常意味着正在从其他地方获取正在进行的数据集,并且您正在尝试同时打开另一个数据读取器。使用任务时,也许你正在执行另一个任务,这就是你没有得到异常的原因。

异常与线程无关。您可以通过打开数据阅读器获得相同的异常,并尝试在不关闭第一个数据的情况下打开一个新的。

我建议您仔细检查您的代码,并确保在使用之前需要进行线程处理。多线程过度使用会产生性能问题和令人难以置信的丑陋漏洞。