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