GrapeCity ActiveReports for .NET 16.0J
非同期または長時間実行のレポート描画の管理
ActiveReportsユーザーガイド > エクスポート > 非同期または長時間実行のレポート描画の管理

非同期または長時間実行のレポート描画処理を管理できます。ActiveReportsでは、さまざまなオプションを使用して、エクスポート処理を制御することができ、より応答性の高いアプリケーションを作成できます。このトピックでは、レポートの描画処理の一般的な使用例について説明します。

進行状況を表示する

以下の手順は、Windowsビューワのアプリケーションを使用して、エクスポート時の描画処理の進行状況を表示する方法を説明します。例としては、[ユーザーフォルダ]\ActiveReportsNET16\Samples\Samples\API\PageAndRDLに格納されたExportサンプルを使用しています。

進行状況は、レポートを描画する時にPDF、画像、HTML、およびExcelのエクスポートで表示できます。

メモ:レポートのPaginationプロパティがFalseに設定されている場合(画像およびExcel描画拡張機能)またはModeプロパティがGalleyに設定されている場合(HTML描画拡張機能)、レポートをエクスポートすると、進行状況は表示されません。
  1. Exportサンプルを開きます。
  2. Visual Studioのツールボックスから、Labelコントロールをフォームにドラッグ&ドロップします。
  3. 以下のコードをフォームに追加します。
    VisualBasic.NETコード。exportButton_Clickメソッド内に貼り付けます
    コードのコピー
    Private Async  Sub ExportAsync(ByVal report As PageReport, ByVal renderingExtension As IRenderingExtension, ByVal outputProvider As StreamProvider, ByVal settings As NameValueCollection)
       labelExport.Text = "エクスポートを開始しました..."
       Dim control As var =  Me 
       var progress = New Progress(progressInfo =>
       {
          control.BeginInvoke(New MethodInvoker(() =>
          {
             labelExport.Text = progressInfo.IsLast ? "エクスポートが終了しました。" : $"{progressInfo.PageNumber}ページをエクスポートしました。"
          ))
          }
    
       }
    )
       await Task.Run(() =>
       {
          Try
             report.Document.Render(renderingExtension, outputProvider, settings, False, False, CancellationToken.None, progress)
          End Try
       }
    )
    End Sub                            
    
    C# code. Paste inside the exportButton_Click() method 
    コードのコピー
    private async void ExportAsync(PageReport report, IRenderingExtension renderingExtension, StreamProvider outputProvider, NameValueCollection settings)
    {
       labelExport.Text = "エクスポートを開始しました...";
       var control = this;
       var progress = new Progress<ProgressInfo>(progressInfo =>
       {
          control.BeginInvoke(new MethodInvoker(() =>
          {
             labelExport.Text = progressInfo.IsLast ? "エクスポートが終了しました。" : $"{progressInfo.PageNumber}ページをエクスポートしました。";
          ))};
       });
       await Task.Run(() =>
       {
          try
          {
             report.Document.Render(renderingExtension, outputProvider, settings, false, false, CancellationToken.None, progress);
          }
          catch
          {
          }
       });
    }                                
    
  4. このメソッドを、report.Document.Renderメソッドではなく、exportButton_Clickメソッドから呼び出します。
  5. プロジェクトを実行します。
  6. [エクスポート]フォームで、エクスポート形式を「PDF」、「画像」、「HTML」のいずれかに設定します。
  7. [エクスポート]ボタンをクリックすると、新しいラベルに進行状況を確できます。
    Click the Export button in Export Sample Report

レポートの描画処理をキャンセルする

次のコードを使用して、レポートの描画処理またはエクスポートをキャンセルできます。

Visual Basic.NET code
コードのコピー
Private Async Sub ExportAsync(ByVal report As PageReport, ByVal renderingExtension As IRenderingExtension, ByVal outputProvider As FileStreamProvider, ByVal settings As NameValueCollection)
    _cancellationTokenSource = New CancellationTokenSource()
    exportButton.Text = "キャンセル"
    exportButton.Click -= exportButton_Click
    exportButton.Click += AddressOf cancelExport
    Await Task.Run(Function()
        Try
            report.Document.Render(renderingExtension, outputProvider, settings, False, False, _cancellationTokenSource.Token)
            Catch __unusedOperationCanceledException1__ As OperationCanceledException
        End Try
    End Function)
    If _cancellationTokenSource.IsCancellationRequested Then MessageBox.Show("エクスポートがキャンセルされました。", "Export", MessageBoxButtons.OK, MessageBoxIcon.Information)
    _cancellationTokenSource.Dispose()
    _cancellationTokenSource = Nothing
    exportButton.Click -= AddressOf cancelExport
    exportButton.Click += exportButton_Click
    exportButton.Text = "エクスポート"
End Sub

Private Sub cancelExport(ByVal sender As Object, ByVal e As EventArgs)
    _cancellationTokenSource?.Cancel()
End Sub
C# code
コードのコピー
private async void ExportAsync(PageReport report, IRenderingExtension renderingExtension, FileStreamProvider outputProvider, NameValueCollection settings)
{
   _cancellationTokenSource = new CancellationTokenSource();
   exportButton.Text = "Cancel";
   exportButton.Click -= exportButton_Click;
   exportButton.Click += cancelExport;
     
   await Task.Run(() =>
   {
      try
      {
         report.Document.Render(renderingExtension, outputProvider, settings, false, false, _cancellationTokenSource.Token);
      }
      catch (OperationCanceledException)
      {
      }
   });
     
   if (_cancellationTokenSource.IsCancellationRequested)
       MessageBox.Show("エクスポートがキャンセルされました。", "Export", MessageBoxButtons.OK, MessageBoxIcon.Information);
   _cancellationTokenSource.Dispose();
   _cancellationTokenSource = null;
   exportButton.Click -= cancelExport;
   exportButton.Click += exportButton_Click;
   exportButton.Text = "エクスポート";
}
     
private void cancelExport(object sender, EventArgs e)
{
   _cancellationTokenSource?.Cancel();
}        

情報をログに記録する

レポートの描画処理に関する情報をログに記録するには、エクスポート呼び出しの前後に次のコードを追加します。詳細については、「トレース リスナー」を参照してください。

Visual Basic.NET code
コードのコピー
Private Sub SurroundingSub()
    Dim traceWriter = New TextWriterTraceListener("TextWriterOutput.log", "myListener")
    Trace.Listeners.Clear()
    Trace.Listeners.Add(traceWriter)
    Trace.TraceInformation($"Exported {progressInfo.PageNumber} pages.")
    Trace.Flush()
    Trace.Listeners.Clear()
End Sub        
C# code
コードのコピー
var traceWriter = new TextWriterTraceListener("TextWriterOutput.log", "myListener")
Trace.Listeners.Clear();
Trace.Listeners.Add(traceWriter);
...
Trace.TraceInformation($"Exported {progressInfo.PageNumber} pages.");
...
Trace.Flush();
Trace.Listeners.Clear();