2017-02-17 38 views
1

複数のPDFバイト配列を印刷しようとしています。ユーザーが複数のレポートを同時に印刷できるようにする機能が必要なので、私は並列foreachを使用しています。この関数は最初のバイト配列を取得しますが、2番目の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(); 
} 
関連する問題