我在c#中打印报告,报告有很多页面,每个页面都有复杂的计算。因为可能有很多页面,每个页面可能需要很长时间,我想异步进行计算。因为这是编码问题的工程问题,我删除了所有的混乱。这就是我的代码归结为:
private void StartPrinting(object sender, PrintPageEventArgs e)
{
// calculate the total width and height of the printing area of the page
// -1 just to be conservative
documentWidth = CalculateDocumentWidth(printDocument, e) - 1;
// -1 just to be conservative
documentHeight = CalculateDocumentHeight(printDocument, e) - 1;
// calculate the columns and rows of all pages
// some calculations ....
// delegate to get results back
DelegateToReportVoPageStructureDescription theDelegate
= ReportPageObjectCalculatedHandler;
for (int i = 0; i < pageStructureObjects.Count; i++)
{
Task.Run(() =>
{
// call method to calculate each page here ....
// results returned by delegate to
// ReportPageObjectCalculatedHandler mehtod
});
}
}
for循环计算每个单独线程中的报表页面,然后每个计算过程的结果都来自以下方法:
public void ReportPageObjectCalculatedHandler(VoReportPageObject voReportPageObject, int pageIndex)
{
lock (thisLock) // thread safety
{
// assign the calculated page to local variable
// count how many pages finished calculation
}
if ( all pages finished )
{
// now i can start printing
}
}
仅在处理完所有页面后才能继续打印。现在您可能会问为什么在我触发打印过程之前不进行所有计算?那是因为在我可以进行任何处理之前我需要页面的尺寸。
我可以在Task.Run(()块之后创建一个循环来检查是否已经计算了所有页面,但这不是一件好事。我需要一些方法来停止打印,直到所有页面计算完成。
我该如何解决这个问题?
答案 0 :(得分:1)
您可以将 if (indexPath.row == self.selectedCellIndexPath.row &&
indexPath.section == self.selectedCellIndexPath.section)
调用返回的任务收集到数组中并使用Task.WaitAll:
Task.Run
但你正在做的事情似乎是Parallel.For的完美候选人:
var tasks = new Task[pageStructureObjects.Count];
for (int i = 0; i < pageStructureObjects.Count; i++)
{
tasks[i] = Task.Run(() =>
{
// call method to calculate each page here ....
// results returned by delegate to
// ReportPageObjectCalculatedHandler mehtod
});
}
Task.WaitAll(tasks);