【问题标题】:What is difference between Task.Factory.StartNew and new Thread().Start()? [duplicate]Task.Factory.StartNew 和 new Thread().Start() 有什么区别? [复制]
【发布时间】:2014-04-22 10:05:16
【问题描述】:

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

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

这是我得到的:

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

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

问题:为什么我会在这里得到线程的差异和异常?

我不太了解任务和 TPL 库。我之前在几个小型项目中使用过 Thread。

【问题讨论】:

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


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

  • new Thread().Start() :总是在新线程中运行,因此成本更高。

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

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

考虑到这一点,我建议您检查您的代码,并确保在使用之前需要线程化。多线程过度使用会导致性能问题和令人难以置信的丑陋错误。

【讨论】:

    猜你喜欢
    • 2012-01-24
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多