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