![]() |
Bild lesen blockiert Datei?
Folgendes Problemchen: Ich habe eine Funktion, die ein Bild lädt:
Code:
Letztere macht nix anderes, als das Image auf ein Formular zu patschen und es anzuzeigen.
private void btnLoadImage_Click(object sender, EventArgs e)
{ String basedir = FW.Instance.SysParams["Stammdaten.Pfade.Bilder"].Value; dlgOpenFile.InitialDirectory = basedir; if (dlgOpenFile.ShowDialog() == DialogResult.OK && Path.GetDirectoryName(dlgOpenFile.FileName) == basedir) { edFilename.Text = Path.GetFileName(dlgOpenFile.FileName); _image = new Bitmap(dlgOpenFile.FileName); btnPreview.Enabled = true; } } private void btnPreview_Click(object sender, EventArgs e) { LabelPreviewHelper.ShowPreview(_image); } Problematisch ist nun, dass das die Datei komplett blockiert. Will heissen selbst wenn ich da aufräume und das Image explizit freigebe, kann ich die Datei dennoch nicht umbennenen oder gar löschen, bis ich die Anwendung beende. Das finde ich etwas doof. Spätestens nachdem ich das Formular schliesse sollte die Datei wieder freigegeben werden. Was muss ich da noch machen? |
Re: Bild lesen blockiert Datei?
Eventuell verhält sich
Code:
genauso wie ein FileStream, der die Datei ja auch erst wieder freigibt, wenn er selber wieder freigegeben wird. Du müsstest also das Bitmap wieder freigeben, wenn du es nicht mehr brauchst. Der GarbageCollector scheint da nicht ganz zu funktionieren, wie es scheint.
new Bitmap
|
Re: Bild lesen blockiert Datei?
...das wars.
Ein einfaches Image.Dispose() beim Schliessen vom Formular hat freilich nicht gereicht. Die GC manuell anzuschmeissen brachte dann den Erfolg. Strange. Danke :) |
Re: Bild lesen blockiert Datei?
Hallo Sebastian,
unter ![]() Zitat:
Unter ![]() Gruß Jürgen PS. Inzwischen hast Du selbst einen Weg gefunden. Ich lasse meinen Beitrag wegen des weiteren Lösungswegs trotzdem stehen. |
Re: Bild lesen blockiert Datei?
@Phoenix: Keine Ursache. Schön dass ich dir helfen konnte. :thumb:
|
Re: Bild lesen blockiert Datei?
Zitat:
a) Sie benötigt zuviele lokale Privilegien (mag aber vielleicht nötig sein) b) Der Konstruktor von SD.Bitmap ist von den Redmondern furchtbar dämlich implementiert worden. Er öffnet einen Stream, aus dem er das Bild liest, aber gibt diesen nicht sofort wieder frei. :wall: Da sie mal wieder(Wer erinnert sich an den schrecklichen ThreadPool in 1.1? :mrgreen: ) irgendeinen Praktikanten rangelassen haben , musst du natürlich selbst ran:
Code:
Aber mal ganz btw: War das jetzt nicht, öhm offensichtlich? Ich meine du hast mehrere Overloads des Konstruktors. Der mit dem Dateinamen ist Schrott, aber der mit dem Stream wäre doch gleich die nächste Adresse gewesen. ;)
private void btnLoadImage_Click(object sender, EventArgs e)
{ String basedir = FW.Instance.SysParams["Stammdaten.Pfade.Bilder"].Value; dlgOpenFile.InitialDirectory = basedir; if (dlgOpenFile.ShowDialog() == DialogResult.OK) { if(!Path.GetDirectoryName(dlgOpenFile.FileName) == basedir)) someErrorProvider.SetError((Control)sender, "WTF willst du in dem Ordner?"); edFilename.Text = Path.GetFileName(dlgOpenFile.FileName); using(Stream stream = dlgOpenFile.OpenFile()) _image = new Bitmap(stream); btnPreview.Enabled = true; } } |
Re: Bild lesen blockiert Datei?
Ich hoffe, es war wenigstens eine hybsche Praktikantin. Zumindest die hier in Deutschland sind immer recht hybsch *g*
Naja, und wenn man den Stream dann noch closed, dann dürfte das auch wirklich so gehen. ;-) |
Re: Bild lesen blockiert Datei?
Zitat:
Zitat:
Mönsch Sebastian, du arbeitest doch nicht erst seit gestern mit .Net... |
Re: Bild lesen blockiert Datei?
Argl.. freilich..
Naja, ich arbeite nicht allzuviel mit using. Der implizite Dispose() - Aufruf war nicht so präsent wie er hätte sein sollen *g* Aber was haben hybsche Mädels mit dem Jüdischen zu tun? |
Re: Bild lesen blockiert Datei?
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz