2013-12-10 56 views
0

我目前正在创建一个应用程序,该应用程序创建许多WPF控件,将它们批量打包,然后将它们发送到打印机。C#中的批量打印

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

有没有什么办法可以发送一个固定文件来打印异步?

这里是我迄今为止...

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()方法,但是这会导致错误。

任何想法??

由于

UPDATE

我试图穿线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; 
    } 
} 
+1

你可以发布你的错误? – Peter

回答

0

您不能运行PrintDocument方法关闭线程,因为它需要STA线程上运行的UI对象。您可以尝试选择在这里(渲染线程关闭该文件,然后在主线程上打印) Printing the content of a DocumentViewer in a different UI thread

也有在后台线程执行打印对话框的一个可行的办法。试试这个链接(其当然不容易):

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

另外,考虑配料或内存渲染的文件事先。它更容易做到这一点脱线,并获得了很多性能。