2017-02-17 727 views
1

我试图打印多个PDF字节数组。由于我需要使用户能够同时打印多个报告的功能,因此我正在使用Parallel foreach。函数通过第一个字节数组,但在第二个Dequeue中,我得到了“集合在枚举器实例化后被修改”。错误。我如何解决这个问题,同时仍然允许用户同时打印?集合在枚举器实例化后被修改错误

下面的代码:

public static void PrintingQueue(Queue<byte[]> printQueue, string printer, int copies) 
    { 
     Parallel.ForEach(printQueue, (currentFile) => 
     { 
      var printFile = printQueue.Dequeue(); 
      PrintWithGSPrint(printFile, printer, copies); 

     }); 
    } 

回答

3

唯一的例外是告诉你发生了什么。随着集合被修改,foreach语句无法正确执行。使用Dequeue方法,您将从要迭代的集合中删除项目。不要删除foreach循环中的项目,只需在完成任务后清理集合。

https://msdn.microsoft.com/en-us/library/1c8bzx97(v=vs.110).aspx

你可以做的另一件事,是通过你的收藏向后使用for声明迭代。这样,如果它是必须的,你将能够删除这些元素。你可以使用这个答案,看看如何向后遍历:https://stackoverflow.com/a/1582317/637840

1

尝试这种解决方案:

的Parallel.ForEach方法为您提供了队列中的每个项目的参数。在该方法中使用该参数进行打印。然后在完成时清除队列。

public static void PrintingQueue(Queue<byte[]> printQueue, string printer, int copies) 
{ 
    Parallel.ForEach(printQueue, (currentFile) => 
    { 
     PrintWithGSPrint(currentFile, printer, copies); 
    }); 

    printQueue.Clear(); 
} 
相关问题