2014-10-01 2 views
1

제 질문은 꽤 간단합니다. 다중 사용자 ERP 환경에서 인쇄 미리보기 대화 상자를 표시해야합니다. 그것은 인쇄가 가능한 한 빨리되어야한다는 것을 스스로 말하고 있습니다. 그러나 아래 코드를 사용하면 약 10 초가 걸립니다! 미리보기가 표시되고 완전히 생성되기까지 몇 초가 걸릴 수 있습니다. 이것은 데이터베이스 액세스 또는 다른 CPU 집중적 인 조작없이 수행됩니다.인쇄 미리보기 성능

이 성능을 향상시킬 방법이나 방법이 있습니까? 필요한 경우 WPF를 사용할 수도 있습니다.

미리보기를 생성하고 닫은 다음 다시 빠르게 생성하면 미리보기가 약 2 ~ 2 초 빨라진다는 것을 알았습니다. 그런 다음 5 초 정도 기다렸다가 다시 생성하면 약 10 초가 걸립니다. 일부 유형의 캐싱이 진행되고 있다고 생각하지만 실제로 발생하는 단서가 없습니다.

using System; 
using System.Collections.Generic; 
using System.Drawing; 
using System.Drawing.Printing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace PrintPerformanceTests 
{ 
    public class PrintPreviewTest 
    { 
     private string printerName; 
     private PrintPreviewDialog printPreviewDialog1; 
     private PrintDocument printDocument1 = new PrintDocument(); 
     private Random random = new Random(); 

     public string PrinterName 
     { 
      get { return printerName; } 
      set { printerName = value; } 
     } 

     public PrintPreviewDialog PrintPreviewDialog 
     { 
      get { return printPreviewDialog1; } 
      set { printPreviewDialog1 = value; } 
     } 

     public PrintPreviewTest(string printerName, PrintPreviewDialog printPreviewDialog) 
     { 
      this.PrinterName = printerName; 
      this.PrintPreviewDialog = printPreviewDialog; 
      printDocument1.PrintPage += new PrintPageEventHandler(printDocument1_PrintPage); 
     } 

     public void GenerateRandomPrintPreview() 
     { 
      Cursor.Current = Cursors.WaitCursor; 
      try 
      { 
       PrintPreviewDialog.Document = printDocument1; 
       PrintPreviewDialog.ShowDialog(); 
      } 
      catch (Exception exc) 
      { 
       Cursor.Current = Cursors.Default; 
       MessageBox.Show(exc.ToString()); 
      } 
      finally 
      { 
       Cursor.Current = Cursors.Default; 
      } 
     } 

     void printDocument1_PrintPage(object sender, PrintPageEventArgs e) 
     { 
      e.Graphics.PageUnit = GraphicsUnit.Millimeter; 
      using(Font f = new Font("Arial", 10f)) 
      { 
       for (int i = 0; i < 20; i++) 
       { 
        string txt = "Random string " + i.ToString(); 
        e.Graphics.DrawString(txt, f, Brushes.Black, new PointF(random.Next(10, 200), random.Next(10,280))); 
       } 
      } 

      e.HasMorePages = false; 
     } 
    } 
} 

사용 : 내 경험에

 PrintPreviewTest pt = new PrintPreviewTest(tbPrinter.Text, printPreviewDialog); 
     pt.GenerateRandomPrintPreview(); 

답변

0

이 시작 지연은 프린터 매개 변수의 초기화와 관련이 있습니다. 프린터 이름 (특히 네트워크 프린터 이름)을 설정하고 인쇄 미리보기 대화 상자를 만들면 먼저 지정된 프린터에 연결하여 설정 (용지 크기 등)을 확인합니다. 그것은 많은 시간이 걸립니다. 이 문제를 극복하는 유일한 방법 (IMHO)은 별도의 스레드에서 프린터 설정을 초기화하는 자체 인쇄 미리보기 대화 상자를 만드는 것입니다.

+0

선택한 프린터에서 지원하는 용지에 대한 정보가없는 인쇄 미리보기, 최대 인쇄 가능 면적 크기, 기본 인쇄 설정 등은 그다지 가치가 없습니다. 내 자신의 인쇄 미리보기를 작성하고 세 번째 또는 네 번째 반복 후에 이러한 설정이 중요하다고 결론을 내 렸습니다. 따라서 실제로 동일한 작업을 수행하고 있지만 프린터 당 응용 프로그램 인스턴스 당 한 번만 수행합니다. 그런 다음 인스턴스가 활성화되어있는 동안 아무나 기본 인쇄 설정을 변경해야하는 경우 "새로 고침"단추를 추가합니다. 또한 네트워크에 연결되어 있거나 사용할 수없는 경우가 아니라면 한 프린터를 쿼리하는 데 시간이 거의 걸리지 않습니다 (내 경험). – Kitet