我目前正在创建一个应用程序,该应用程序创建许多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;
}
}
你可以发布你的错误? – Peter