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():将始终在新线程中运行,因此成本更高。
异常意味着有一个正在进行的数据集正在从其他地方读取,而您正试图同时打开另一个数据读取器。在使用任务时,可能您正在一个接一个地执行一个任务,这就是为什么您没有得到异常的原因。
异常与线程无关。您可以通过打开一个数据读卡器来获得相同的异常,并尝试在不关闭第一个读卡器的情况下打开一个新的读卡器。
我建议考虑一下您的代码,并确保在使用它之前需要线程。多线程过度使用会造成性能问题和令人难以置信的丑陋错误。