public void PrintOrders(PrintJob printJob, Ticket ticket, Func<Order, bool> orderSelector) { ticket = ObjectCloner.Clone2(ticket); if (printJob.ExcludeTax) ticket.TaxIncluded = false; IEnumerable<Order> ti; switch (printJob.WhatToPrint) { case (int)WhatToPrintTypes.NewLines: ti = ticket.GetUnlockedOrders(); break; case (int)WhatToPrintTypes.GroupedByBarcode: ti = GroupLinesByValue(ticket, x => x.Barcode ?? "", "1", true); break; case (int)WhatToPrintTypes.GroupedByGroupCode: ti = GroupLinesByValue(ticket, x => x.GroupCode ?? "", Resources.UndefinedWithBrackets); break; case (int)WhatToPrintTypes.GroupedByTag: ti = GroupLinesByValue(ticket, x => x.Tag ?? "", Resources.UndefinedWithBrackets); break; case (int)WhatToPrintTypes.LastLinesByPrinterLineCount: ti = GetLastOrders(ticket, printJob); break; case (int)WhatToPrintTypes.LastPaidOrders: ti = GetLastPaidOrders(ticket); break; default: ti = ticket.Orders.Where(orderSelector).OrderBy(x => x.Id).ToList(); break; } Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new Action( delegate { try { InternalPrintOrders(printJob, ticket, ti); } catch (Exception e) { _logService.LogError(e, Resources.PrintErrorMessage + e.Message); } })); }