关于c#:Task.Factory.StartNew和新的Thread()之间有什么区别.Start()?

What is difference between Task.Factory.StartNew and new Thread().Start()?

本问题已经有最佳答案,请猛点这里访问。

我有一个dbContext(Entity Framework 6.0)和1000个对象。

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

这就是我得到的:

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

我理解这是因为使用了相同的dbContext对象和对它的多个调用,所以得到了线程的异常。但我不确定。

问题:为什么我要在这里得到线程的区别和例外?

我对任务和TPL库不太了解。我以前在几个小规模的项目中使用过线程。


  • task.factory.startnew:启动将在线程池线程中运行或可能在同一线程中运行的新任务。如果它是在线程池线程中运行的,那么线程在完成后会返回到池中。线程创建/销毁是一个昂贵的过程。

  • new thread().start():将始终在新线程中运行,因此成本更高。

异常意味着有一个正在进行的数据集正在从其他地方读取,而您正试图同时打开另一个数据读取器。在使用任务时,可能您正在一个接一个地执行一个任务,这就是为什么您没有得到异常的原因。

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

我建议考虑一下您的代码,并确保在使用它之前需要线程。多线程过度使用会造成性能问题和令人难以置信的丑陋错误。