【问题标题】:Batch Printing in C#C# 中的批量打印
【发布时间】:2013-12-10 09:34:50
【问题描述】:

我目前正在开发一个应用程序,该应用程序创建许多 WPF 控件,对它们进行批处理,然后将它们发送到打印机。

我遇到的问题是应用程序在创建下一批之前等待上一批完成。这意味着打印机正在等待第二批,而不是在完成第一批打印后准备就绪。

有什么方法可以发送一个固定的文档来异步打印??

这是我目前所拥有的......

void PrintInBatch(IList<object> objsToPrint, int batchSize)
{
     int printed = 0;
     while (printed < objsToPrint.Count())
     { 
         IList<object> batchToPrint = objsToPrint.Skip(printed).Take(batchSize);

         this.Print(batchToPrint);

         printed += batchSize;
     }
}

void  Print(IList<object> objsToPrint)
{
    const double width = 5.8*96;
    const double height = 8.3*96;

    var pageSize = new Size(width, height); // A5 page, at 96 dpi
    var document = new FixedDocument();
    document.DocumentPaginator.PageSize = pageSize;

    int iii = 0;
    //Add packslips to document
    foreach (object objToPrint in objsToPrint)
    {
        PrintControl printControl = new PrintControl();
        printControl.SetDetails(objToPrint);

        var fixedPage = new FixedPage();
        fixedPage.Width = pageSize.Width;
        fixedPage.Height = pageSize.Height;

        fixedPage.Children.Add(printControl);
        fixedPage.Measure(pageSize);
        fixedPage.Arrange(new Rect(new Point(), pageSize));
        fixedPage.UpdateLayout();

        var pageContent = new PageContent();
        ((IAddChild) pageContent).AddChild(fixedPage);
        document.Pages.Add(pageContent);
     }

     PrintQueue queue = new LocalPrintServer().GetPrintQueue(printerName);
     dlg.PrintQueue = queue;

     PageMediaSize pageMedia = new PageMediaSize(PageMediaSizeName.ISOA5);
     dlg.PrintTicket.PageMediaSize = pageMedia;
     dlg.PrintTicket.Duplexing = Duplexing.OneSided;
     dlg.PrintDocument(document.DocumentPaginator, "Packslips"); //Program waits here until print finished
 }

我尝试在单独的线程上运行 dlg.PrintDocument() 方法,但这会导致错误。

有什么想法吗??

谢谢

更新

我已尝试线程化 PrintInBatch();这确实有效,但这意味着每个批次都是同时创建的,这是一个巨大的资源消耗。

我是这样做的:

void PrintInBatch(IList<object> objsToPrint, int batchSize)
{
     int printed = 0;
     while (printed < objsToPrint.Count())
     { 
         IList<object> batchToPrint = objsToPrint.Skip(printed).Take(batchSize);

         Thread thread = new Thread(() => this.Print(batchToPrint));
         thread.SetApartmentState(ApartmentState.STA);
         thread.Start();

         printed += batchSize;
     }
}

【问题讨论】:

  • 你能发布你的错误吗?

标签: c# c#-4.0 printing batch-processing


【解决方案1】:

您不能在线程外运行 PrintDocument 方法,因为它需要 STA 线程上的 UI 对象才能运行。您可以在此处尝试该选项(从线程渲染文档,然后在主线程上打印) Printing the content of a DocumentViewer in a different UI thread

还有一种在后台线程上实现打印对话框的可能方式。试试这个链接(肯定不容易):

http://www.infragistics.com/community/forums/p/71258/360560.aspx

另外,请考虑预先在内存中批处理或渲染文档。在线程外更容易做到这一点,并提高性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多