打印预览性能

时间:2014-10-01 13:34:55

标签: c# .net wpf performance printing

我的问题很简单。我需要在多用户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();

1 个答案:

答案 0 :(得分:0)

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