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