system.drawing

___ qstnhdr ___ System.Drawing Out of Memory Exception ___ tag123c ___ C # (sprich "Cis") ist eine objektorientierte Programmiersprache auf hohem Niveau, die für die Erstellung einer Vielzahl von Anwendungen entwickelt wurde, die auf dem .NET Framework (oder .NET Core) ausgeführt werden. C # ist einfach, leistungsfähig, typsicher und objektorientiert. ___ answer35731675 ___

Ich habe versucht, die Lösung "Joe White" vorgeschlagen und das war es. Es wurde eine OutOfMemoryException ausgelöst, weil die Breite und Höhe des Rechtecks ​​0 waren. In meinem Fall wurde das Fenster minimiert, als die Ausnahme auftrat.

Hier ist ein Beispiel;

%Vor%     
___ answer6506132 ___

Es ist eine ziemlich schlechte Ausnahme: Ссылка .. nicht genug Speicher um die Ausführung des Programms fortzusetzen .

Sie werden oft feststellen, wenn Sie so viel zugewiesen haben, dass "einfache" Operationen / Zuweisungen diese Nachricht werfen, wird die App bald darauf abstürzen. Wenn es eine massive Zuweisung gibt, die fehlschlägt, können Sie möglicherweise fortfahren.

Wenn die App etwas Wichtiges tut, sollten Sie versuchen, die Dinge ordnungsgemäß zu schließen.

Um Ihre Fragen explizit zu beantworten:

  1. Sie werden ausgelöst, damit die App reagieren / wiederherstellen kann: Einige Speicherzuordnungen (Objekte mit 10 GB) können in vielen Situationen fehlschlagen, möglicherweise ein Absturz mit einer Zeile ( %code% ) Entsprechung) sollte wirklich eine Ausnahme auslösen, anstatt alles abzustürzen

  2. Es sollte keinen versteckten Effekt geben, aber wenn eine Zuweisung fehlschlägt, dann vielleicht das nächste Mal, wenn Sie ein %code% oder ein anderes nützliches Objekt auf eine kleine Weise für den allgemeinen Betrieb der App reservieren wollen: Dinge könnten instabil werden . Je nach Umgebung können Sie diese Ausnahme jederzeit erhalten.

Bearbeiten: Jeder, der dies liest, sollte auch bedenken, dass GDI + diese Ausnahme anscheinend auch aus anderen Gründen auslöst.

    
___ qstntxt ___

Meine Anwendungsgrafik-Engine löst diese Ausnahmen aus. Sie werden alle von einem leeren Fangblock verzehrt. In den frühen Tagen fand ich eine, die nicht gefangen war (verbunden mit der Erweiterung des Stiftes, wie ich mich erinnere). Ich habe es mit Versuch und einem leeren Fangblock umgeben. Es scheint, dass diese Ausnahmen keinen Einfluss auf die erstellte Zeichnung haben. Ich habe etwas darüber gelesen, ohne es wirklich zu verstehen oder zu verstehen.

Also zu meinen Fragen:

  1. Warum sollten diese geworfen werden, wenn sie sicher konsumiert werden können? und
  2. Ist es sicher, sie zu ignorieren? Ich mache mir Sorgen, dass jeder einen versteckten Effekt hat. Ich habe Speicherlecks, die ich zum Beispiel nie gefunden habe.
___ tag123systemzeichnung ___ System.Drawing ist ein Namespace des .NET-Frameworks. Es bietet Zugriff auf die grundlegenden Grafikfunktionen von GDI +. ___ answer6506231 ___

Ich habe gesehen, dass System.Drawing OutOfMemoryExceptions geworfen hat, selbst wenn nicht genug Arbeitsspeicher zur Verfügung steht. Einige GDI + -Funktion gibt anscheinend nur einen dummen Fehlercode zurück.

IIRC, Sie erhalten eine OutOfMemoryException, wenn Sie versuchen, einen LinearGradientBrush zu verwenden, um ein Rechteck zu füllen, dessen Breite oder Höhe Null ist. Es kann auch andere Bedingungen geben, aber das ist die Hauptsache, in die wir geraten sind.

In diesem Fall müssen Sie nicht versuchen / fangen. Fügen Sie einfach eine %code% -Anweisung zu Ihrem Zeichnungscode hinzu und füllen Sie das Rechteck nicht, wenn die Breite oder Höhe Null ist.

Update: Nach den Kommentaren auf Diese Antwort kann auch auftreten, wenn Sie versuchen, eine beschädigte Image-Datei zu laden. Dafür hättest du keine andere Wahl als zu versuchen / fangen.

Sie sind wahrscheinlich sicher OutOfMemoryExceptions von GDI + abzufangen, aber halten Sie die try-Blöcke so klein wie möglich. Erwägen Sie, die Ausnahmen zu protokollieren, damit Sie die Protokolle analysieren und gegebenenfalls einen defensiven Code hinzufügen können. Sie möchten eine echte OutOfMemoryException nicht maskieren, aber Sie möchten auch nicht, dass ein dummer GDI + -Fehlercode Ihre App zum Absturz bringt.

    
___
4
Antworten

Laden einer Datei in eine Bitmap, wobei die ursprüngliche Datei intakt bleibt

Wie geht das in C #? Wenn ich Bitmap.FromFile () verwende, ist die ursprüngliche Datei gesperrt. Wenn ich Bitmap.FromStream () verwende, ist die ursprüngliche Datei nicht gesperrt, aber in der Dokumentation steht "Sie müssen den Stream für...
02.08.2010, 10:11
3
Antworten

System.Drawing Out of Memory Exception

Meine Anwendungsgrafik-Engine löst diese Ausnahmen aus. Sie werden alle von einem leeren Fangblock verzehrt. In den frühen Tagen fand ich eine, die nicht gefangen war (verbunden mit der Erweiterung des Stiftes, wie ich mich erinnere). Ich habe e...
28.06.2011, 12:01