在枚举器实例化错误后修改了集合

时间:2017-02-17 17:37:44

标签: c#

我正在尝试打印多个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);

        });
    }

2 个答案:

答案 0 :(得分:3)

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

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

您可以做的另一件事是使用for语句向后遍历您的集合。这样,如果必须,您将能够删除元素。您可以使用此答案来查看如何向后迭代:https://stackoverflow.com/a/1582317/637840

答案 1 :(得分:1)

试试这个解决方案:

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

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

    printQueue.Clear();
}