【发布时间】: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