2014-10-01 78 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