Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hallo!

Bearbeite mehrere Bilder in Schleife und bekomme immer die Meldung, dass noch ein anderer Prozess auf die Bilder zugreift. Laut Procmon tut das nur meine eigene Applikation.

string sTempFile = Path.GetTempFileName();

rdBilder.scale(sDatei, sTempFile);

Application.DoEvents();

GC.Collect();

System.Threading.Thread.Sleep(1000);

File.Delete(sDatei);

File.Copy(sTempFile, sDatei);

File.Delete(sTempFile);

nAktu++;

in der roten Zeile tritt der Fehler auf. Wenn ich allerdings die grünen Zeilen einfüge, kommt der Fehler nicht. Daher denke ich, dass meine eigene Applikation noch auf eine Datei verweist und das offene FileHandle nur nicht schnell genug geschlossen wird. (außerdem würde ich die grünen Zeilen gerne wieder entfernen ;) )

In der statischen Funktion rdBilder.scale verwende ich nur WPF und einen MemoryStream, der allerdings mit using verwendet wird und dementsprechend auch alle Resourcen wieder freigeben sollte.

Verzweifle jetzt seit einer Woche und wäre über ein paar gute Vorschläge sehr erfreut.

Vielen Dank schon im Voraus :)

Geschrieben

Hi,

du musst in der Scale Methode etwas falsch machen. Anstelle von

Application.DoEvents();

GC.Collect();

System.Threading.Thread.Sleep(1000);

kannst du

GC.Collect();

GC.WaitForPendingFinalizers();

verwenden, das ist allerdings nur ein Workaround für das Problem in der Scale Methode.

Geschrieben

Hallo!

Vielen Dank für den Tipp! Funktioniert schonmal. Ist das eine Methode, die "korrekt" ist (also mit dem GarbageCollector). Bin relativ neu in .NET und wie ich es verstanden habe, sollte der GC nach Möglichkeit nicht verwendet werden, da er sehr zeitaufwendigist sein kann (bei Schleifen mit vielen Dateien). Gibt es noch eine andere Möglichkeite, die Routine korrekt umzuschreiben? Wenn nicht trotzdem vielen Dank, ich war schon kurz davor aufzugeben ;)

Laut MSDN ist ein Aufräumen in WPF nicht nötig, deshalb haben die Objekte da auch kein Disposable. Und der MemoryStream wird vom using korrekt beendet.

Hier die scale-Methode:

public static void scale(string sDatei, string sTemp)

{

using (MemoryStream outStream = new MemoryStream())

{

BitmapImage iBitmapImage = new BitmapImage();

iBitmapImage.BeginInit();

iBitmapImage.UriSource = new Uri(sDatei);

iBitmapImage.EndInit();

double x = iBitmapImage.Width;

double y = iBitmapImage.Height;

double xFactor = 267 / x;

double yFactor = 200 / y;

TransformedBitmap iTransformedBitmap = new TransformedBitmap();

iTransformedBitmap.BeginInit();

iTransformedBitmap.Source = iBitmapImage;

iTransformedBitmap.Transform = new ScaleTransform(xFactor, yFactor);

iTransformedBitmap.EndInit();

BitmapEncoder enc = new BmpBitmapEncoder();

enc.Frames.Add(BitmapFrame.Create(iTransformedBitmap));

enc.Save(outStream);

System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(outStream);

bmp.Save(sTemp, System.Drawing.Imaging.ImageFormat.Jpeg);

}

}

Geschrieben

Hi,

Hallo!

wie ich es verstanden habe, sollte der GC nach Möglichkeit nicht verwendet werden

Richtig, die GarbageCollection sollte man ausschließlich der CLR überlassen.

[...] Und der MemoryStream wird vom using korrekt beendet. [...]

der schon, aber Dein Bitmap nicht:

[...]

System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(outStream);

bmp.Save(sTemp, System.Drawing.Imaging.ImageFormat.Jpeg);

[...]

Da gehört auch ein using bzw. Dispose hin.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...