Speicherverlust im MediaPlayer

8

Kann jemand bitte erklären, warum das folgende Programm nicht genügend Speicher hat?

%Vor%

Um fair zu sein, die spezifische Ausnahme, die ich erhalte, ist System.ComponentModel.Win32Exception , "Nicht genug Speicher ist verfügbar, um diesen Befehl zu verarbeiten." Die Ausnahme tritt bei dem Versuch auf, einen neuen MediaPlayer zu erstellen.

MediaPlayer implementiert die IDisposable -Schnittstelle nicht, sodass ich nicht sicher bin, ob eine andere Bereinigung notwendig ist. Ich habe sicherlich keine in der MediaPlayer-Dokumentation gefunden.

    
Sid G. 29.05.2015, 18:08
quelle

2 Antworten

0

My rate ist, dass die erstellten Thread-Objekte nicht rechtzeitig gesammelt werden.

Da Sie in Ihrem Kommentar angeben, dass Sie kein Glück haben, eine Lösung zu finden, die kein Speicherleck enthält , poste ich diese Alternative als Antwort, obwohl sie es ist versucht nicht, deine ursprüngliche Frage zu beantworten.

Wenn Sie stattdessen den ThreadPool verwenden, läuft er (a) viel schneller und (b) stürzt nicht ab.

%Vor%

Auf meinem Computer habe ich kein Problem, 10 Millionen Thread-Pool-Threads in wenigen Sekunden zu erstellen.

%Vor%     
Micke 09.06.2015, 12:36
quelle
1

Ich hatte vor langer Zeit eine Anwendung, die Daten in ein Bild gerendert und über eine PictureBox als Ergebnis platziert hat, wie eine Pipeline von graphic engine, ...

Die Sache war mit dir gemeinsam, war der Mangel an Speicher, es war so, ...

  • 66%
  • 67%
  • 68%
  • 69%
  • 70%
  • 71%
  • 72%
  • 73%
  • 74%
  • 70% - & gt; Automatisches Sammeln von Abfällen
  • 71%
  • 72%
  • 73%
  • 74%
  • 75%
  • 76%
  • 77%
  • 78%
  • 79%
  • 80%
  • 81%
  • 77% - & gt; Automatisches Sammeln von Abfällen
  • 78%
  • 79%
  • .
  • .
  • .

Und viele Auto Garbage Collecting bei hohem Speicher um 90% bis 97%, ... aber anscheinend war es nicht genug, und irgendwann 97% und 98% System (Anwendung) stürzte mit Speicherproblem ...

Ich komme also mit dieser Idee, Garbage Collector alle paar Frames aufzurufen, also habe ich das gemacht: GC.Collect ();

GC.Collect es selbst ist zu schwer, auch wenn es zu viele Objekte im Speicher sind, ... aber wenn Sie nicht zu viele Objekte verlassen, funktioniert es glatt, ...

es gibt auch viele Dinge über das Finalisieren von Objekten, aber ich bin mir nicht sicher, ob sie richtig funktionieren, da sie natürlich in - & gt; x = null

was bedeutet, dass wir die Verbindung zu diesem Objekt abgebrochen haben, aber nicht heißen, dass wir dieses Objekt nicht irgendwo in der Galaxie haben (z. B. können Sie Objektdestruktor mit einer Nachricht füllen und nach Verlassen des Objekts sehen, dass es gewonnen hat) t sofort zerstört werden, dauert es, bis Sie Ihre Anwendung schließen / GC.Collect / Mangel an Speicher aufrufen, oder vielleicht zufällige automatische Sammlung), ... bis es zerstört wird, ... so zum Beispiel als die "using" -Richtlinie , wir rufen "Dispose" -Methode auf, und wir füllen unsere Dispos mit obj = null, ... dann bin ich nicht sicher, ob ich Ihnen empfehlen sollte, die finalize-Methode zu schreiben, aber es gibt noch eine Sache ... da ist ein Marshal-Objekt , die ich nicht weiß, woher es kommt, und wenn es über alle Objekte funktioniert, sehe ich einige Programmierer verwenden, um Objekte zu lösen, ..., ich weiß nicht, wie es funktioniert, aber es kann wirklich das Objekt freigeben aus unserer Erinnerung, ...

Wenn Sie nichts Nützliches gefunden haben, ruft meine erste Option GC.Collect ...

auf

Sie können auch seine Parameter einstellen, so dass weniger Objekte erfasst werden als normalerweise.

Ссылка

Ressourcen in .Net C # freigeben

Ich habe das auch nicht vollständig gelesen, aber anscheinend hat er Thread- und Speicherprobleme: Ressourcen freigeben, wenn der Thread nicht aktiv ist

    
deadManN 09.06.2015 14:01
quelle