Out of Memory Exception bei Verwendung von File Stream Write Byte zur Ausgabe des Fortschritts über die Konsole

Ich habe den folgenden Code, der beim Schreiben großer Dateien eine Speicherausnahme auslöst. Fehlt mir etwas?

Ich bin nicht sicher, warum es einen Fehler wegen unzureichenden Speichers auslöst, da ich dachte, der Filestream würde nur maximal 4096 Bytes für den Puffer verwenden? Ich bin mir nicht ganz sicher, was es für den Buffer bedeutet, ehrlich zu sein, und jeder Rat wäre willkommen.

 public static async Task CreateRandomFile(string pathway, int size, IProgress<int> prog)
    {
        byte[] fileSize = new byte[size];
        new Random().NextBytes(fileSize);
        await Task.Run(() =>
           {
               using (FileStream fs = File.Create(pathway,4096))
               {

                   for (int i = 0; i < size; i++)
                   {
                       fs.WriteByte(fileSize[i]);
                       prog.Report(i);
                   }

               }

           }
       );
    }

    public static void p_ProgressChanged(object sender, int e)
    {
        int pos = Console.CursorTop;
        Console.WriteLine("Progress Copied: " + e);
        Console.SetCursorPosition (0, pos);
    }

    public static void Main()
    {
        Console.WriteLine("Testing CopyLearning");
        //CopyFile()
        Progress<int> p = new Progress<int>();
        p.ProgressChanged += p_ProgressChanged;
        Task ta = CreateRandomFile(@"D:\Programming\Testing\RandomFile.asd", 99999999, p);
        ta.Wait();
    }

Bearbeiten: Die 99.999.999 wurde soeben erstellt, um eine 99-MB-Datei zu erstellen.

Hinweis: Ich habe prog.Report (i) auskommentiert und es wird gut funktionieren. Es scheint aus irgendeinem Grund, der Fehler tritt in der Zeile

Console.writeline("Progress Copied: " + e);

Ich bin nicht ganz sicher, warum dies einen Fehler verursacht? Der Fehler könnte also auf das progressEvent zurückzuführen sein?

Edit 2: Ich habe die folgenden Anweisungen befolgt, um den Code so zu ändern, dass der Fortschritt alle 4000 Bytes gemeldet wird:

 if (i%4000==0)
     prog.Report(i);

Aus irgendeinem Grund. Ich kann jetzt Dateien mit einer Größe von bis zu 900 MB schreiben.

Ich denke, die Frage ist, warum der Code von "Edit 2" es erlauben würde, bis zu 900 MB zu schreiben. Liegt es daran, dass der Fortschritt gemeldet wird und bis zu 4000x weniger auf die Konsole geschrieben wird als zuvor? Ich wusste nicht, dass die Konsole so viel Speicherplatz beanspruchen würde, vor allem, weil ich davon ausgehe, dass sie nur "Fortschritt kopiert" ausgib

Edit 3:

Aus irgendeinem Grund, wenn ich die folgende Zeile wie folgt ändere:

 for (int i = 0; i < size; i++)
      {
          fs.WriteByte(fileSize[i]);
          Console.Writeline(i)
          prog.Report(i);
      }

enn sich vor dem prog.Report (i) eine "Console.Writeline ()" befindet, funktioniert dies einwandfrei und das Kopieren der Datei dauert sehr lange. Dies lässt mich glauben, dass es sich aus irgendeinem Grund um ein Konsolenproblem handelt, aber ich bin mir nicht sicher, was.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage