【问题标题】:Deciding whether to use a inner Parallel.For or Task决定是使用内部 Parallel.For 还是 Task
【发布时间】:2014-04-10 14:03:23
【问题描述】:

我正在开发一个应用程序,该应用程序基本上采用原始 sql,执行它,将其导出为某种格式,然后对其进行压缩并将其发布到文件共享中。

由于每个报告都是单独的并且与下一个报告无关,并且托管应用程序的服务器计算机将有足够的能力,我想利用任务库。我正在考虑使用 Parallel.For 来枚举我的报告请求集合,以便可以在单独的线程上处理它们:

            Parallel.ForEach(DataAccessFactory().GetPendingReportRequests(), req =>
            {
                ILogger log = Log.ForContext("Report ID", req.Id);
                try
                {
                    log.Information("Starting Work");
                    new ReportWorker(DataAccessFactory(), ZipPackageFactory(), FileSystemFactory()).Run(req);
                }
                catch (Exception ex)
                {
                    log.Error(ex.Message);
                }
                finally
                {
                    log.Information("Ending Work");
                }
            }
        );  

在 ReportWorker 类中发生的最后一个处理步骤是将数据导出到 excel(或 csv),压缩每个 zip 文件,最后将文件复制到删除共享(在云上)。这可能是一个漫长的过程,我想知道我是否应该在这里使用另一个 Parallel.For(对于每个文件)或使用一个任务。我对 Task 对象的使用还不是很熟悉。

任何帮助将不胜感激。

【问题讨论】:

  • 可能有点话题,但由于您的带宽很可能会成为瓶颈,因此使用 1 或 10 个线程上传数据并不重要。因此,并行处理报告然后将它们排队到其他地方上传是有意义的。这也应该使错误处理更容易(丢失连接等)
  • 好主意。我将其保留在同一进程中的原因是,在所有文件都成功上传之前,我们不会将数据库更新为“已完成”状态。

标签: c# .net multithreading task-parallel-library parallel.foreach


【解决方案1】:

我认为并行 foreach 很好,但听起来您确实可以通过 TPL 数据流利用您的机器。

您可以从这里开始:http://msdn.microsoft.com/en-us/library/hh228603(v=vs.110).aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 2015-10-08
    • 2019-04-05
    相关资源
    最近更新 更多