Frage

Es sieht desceptively leicht System.Drawing verwenden Thumbnails in Ihrer ASP.NET-Anwendung zu erstellen. Aber MSDN sagt Ihnen :

  

Klassen im System.Drawing-Namespace sind nicht für die Verwendung in einem Windows oder ASP.NET-Dienst unterstützt. Der Versuch, diese Klassen zu verwenden aus einer dieser Anwendungstypen erzeugen können unerwartete Probleme wie verminderte Betriebsleistung und Laufzeitausnahmen.

'Out of memory' Fehler innerhalb dieser Art von GDI + Code

Ich sehe intermittented. Ich fange an, dies zu vermuten, dass die Ursache ist.

Wie geht es Menschen serverseitige Bildbearbeitung? Kann jemand eine Alternative empfehlen, dass mein Server nicht sprengen?

Der entsprechende Code unten. Die Ausnahme geschieht intermittierend in System.Drawing.Graphics.DrawImage. Ich habe gerade dieses Projekt geerbt, also würde ich brauchen, um die Protokolle zu überprüfen, um zu sehen, wie oft diese getroffen wird / wie oft bekommen wir eine Ausnahme ...

public byte[] Resize(int newWidth, int newHeight, Image orignalImage)
{
    Bitmap bitmap = new Bitmap(newWidth, newHeight);
    Graphics g = Graphics.FromImage(bitmap);
    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

    Rectangle r = new Rectangle(0, 0, newWidth, newHeight);
    g.DrawImage(orignalImage, r, r.X, r.Y, orignalImage.Width, orignalImage.Height, GraphicsUnit.Pixel);

    MemoryStream stream = new MemoryStream();
    bitmap.Save(stream, ImageFormat.Jpeg);

    // clean up memory leaks
    if (bitmap != null)
    {
        bitmap.Dispose();
        bitmap = null;
    }
    if (g != null)
    {
        g.Dispose();
        g = null;
    }


    return stream.ToArray();
}

UPDATE : Ich durch das gesamte Projekt gesucht haben überall da wir GDI verwenden + und setzen using() { } um alles, was IDisposable ist. Ich habe ‚out of memory‘ Ausnahme nicht gesehen, da ich das getan habe.

War es hilfreich?

Lösung

Angenommen, Sie „Material“ pro Anfrage tun werden, könnten die Probleme sein

  1. Der Prozessor intensiver Vorgang. Manipulation von Bildern, die Zeit in Anspruch nehmen könnte

  2. Wenn Sie die Datei speichern, wird es auf die Festplatte Problemen führen.

  3. Sie können mit HTTP-Handler ,

  4. System.Drawing Objekte Entsorgung sollte eine Priorität ( mit () {} statement)

  5. Asynchronous Seiten können hier erkundet werden.

Andere Tipps

Warum Sie setzen keine separaten Arbeits Server auf, die über einen Web-Service ausgesetzt ist.

Ich würde Sie empfehlen, um diese Operationen eine Ausnahmebehandlung Code zu setzen, so dass Sie garantiert sind, Ihre GDI + Objekte zu entsorgen. Gute Praxis Ihre Streams zu schließen ... obwohl meines Wissens MemoryStream Objekt verwaltet wird, so sollte sich schließen, wenn GC'd.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top