【问题标题】:Task or Threads c# [duplicate]任务或线程c#[重复]
【发布时间】:2019-01-30 16:17:45
【问题描述】:

我有两种情况,我不确定是使用任务还是线程(使用 dot net Framework 4.7)

场景 1:数据库查询

我有一组使用 SqlCommand 类执行的数据库查询。我需要所有给定的查询并行运行。查询的运行时间为 1 分钟到 60 分钟。

在这种情况下什么更好?线程/任务在等待查询完成时实际上是“活动的”吗?

场景 2:解析 XML

假设列表或数组中有 1000 个 XmlFile 对象。我有一组需要从这 1000 个文件中解析为 DataTable 对象的 XPath 表达式(以便稍后部署到数据库)。 最好的情况是并行解析这 1000 个文件中的许多文件。

解析时间不会太长,但肯定会超过几秒钟。我目前使用 Task.Run() 实现了这一点,1000 次大约需要 90 秒,尽管我无法真正监控其中有多少是并行运行的。

是否还有关于何时服用什么的一般规则?

谢谢

【问题讨论】:

  • 首先,一般使用Tasks over Threads。其次,如果您想并行运行,请考虑使用 Parallel.For/ForEach 方法,该方法将提供自动负载平衡和其他功能,以优化 CPU 使用率,从而缩短处理时间和优化资源使用率。
  • 在您的第一个纯 I/O 绑定工作场景中,使用 SqlCommand 对象的 Async 方法,该方法无需任何线程即可提供异步处理。因此,不需要额外的线程或 Task.Run - 两者都可能会降低您的性能。
  • 在您的第二个示例中,不要使用 Task.Run 而是使用 Parallel.For/ForEach,如果您想并行运行大量工作项(例如 1000 文件解析),它会提供更优化的资源处理操作。

标签: c# multithreading task threadpool


【解决方案1】:

线程用于在 Windows 中创建和操作线程。

Task 代表一些异步操作,是 Task Parallel Library 的一部分,这是一组用于异步和并行运行任务的 API。

考虑到Task比线程更抽象,它通常创建在线程池上,被视为后台线程,而线程默认不是后台,可以通过下面两个图中的代码验证。

这样,我建议尽可能使用更高级别的抽象。因此,您应该使用任务而不是线程,因为它是在已经系统创建线程的线程池上创建的,以提高性能,您不必担心显式启动/管理自己的线程。

洛杉矶。

【讨论】:

  • 一般是在线程池上创建的不是真的。考虑一个async 操作
  • 认为 Task 比线程更抽象 是正确的,但其中很多有点不稳定
猜你喜欢
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 2018-07-05
  • 1970-01-01
  • 1970-01-01
  • 2019-10-10
相关资源
最近更新 更多