如何在页面计算完成之前停止打印

时间:2016-03-21 08:27:50

标签: c# .net winforms printing desktop

我在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(()块之后创建一个循环来检查是否已经计算了所有页面,但这不是一件好事。我需要一些方法来停止打印,直到所有页面计算完成。

我该如何解决这个问题?

1 个答案:

答案 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);