2014-10-01 112 views
1

我的问题非常简单。我需要在多用户ERP环境中显示打印预览对话框。它说明印刷应该尽可能快。 但是,如果我使用下面的代码,大约需要10!预览显示并完全生成之前的几秒钟。这是没有数据库访问或任何其他CPU密集型操作。打印预览性能

有没有改善这种性能的方法或方法?如果有必要,我也可以使用WPF。

我注意到,如果您生成预览,关闭它,然后再次快速生成它,它反应更快,大约一两秒钟。如果您再等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

在我的经验,这个启动延迟有关的打印机参数初始化。设置打印机名称(尤其是网络打印机名称)并创建打印预览对话框时,它首先连接到指定的打印机并检查其设置(纸张大小等)。这需要很多时间。解决此问题的唯一方法(恕我直言)是创建您自己的打印预览对话框,以单独的线程初始化打印机设置。

+0

没有关于所选打印机支持的纸张,最大可打印区域尺寸,默认打印设置等信息的打印预览不值多少,恕我直言。我编写了自己的打印预览器,经过第三次或第四次迭代后,我认为这些设置非常重要,所以我实际上正在做同样的事情,但每个打印机只有一个应用程序实例。然后我添加“刷新”按钮,任何人都应该在实例激活时更改默认打印设置。而且,查询一台打印机几乎不需要时间,除非它是联网的并且不可用(我的经验)。 – Kitet 2016-08-16 18:35:08