Jeg har en Windows form hvorpå jeg ved opstart loader 12 PictureBoxes ind i en Panel kontrol. Eller rettere 12 instanser af en klasse der nedarver fra PictureBox.
Hver af disse pictureboxes skal vise en thumbnail af et billede fra en folder på disken. Jeg gør det p.t. nemt ved blot at sætte pictureboxens SizeMode = Zoom.
Min klasse : public class BackupPicture : PictureBox { public BackupPicture() { this.SizeMode = PictureBoxSizeMode.Zoom; }
public string FileName { get { return this.ImageLocation; } set { try { Image i = this.Image; this.Image = null; i.Dispose(); } catch(Exception e) { }
this.Load(value); } } }
Ovenstående virker, men... det kører jo ikke asynkront. Det vil jeg gerne have at det skal, MEN vælger jeg at loade mit billede ind asynkront ved hjælpe af LoadAsync, så fejler skidtet... Jeg tror at det er den overliggende .Dispose der går ind og laver rod i det, men jeg er ikke sikker. Er der nogle forslag til hvordan jeg kan komme ud over dette?
P.S.: Det er ikke et alternativ, at undlade at kalde .Dispose, da jeg så bare bruger RAM uden at frigive det igen.
Jeg forstår ikke helt det du gør, med først at putte dit Image over i en variabel, for derefter at dispose den. Det gør ingenting. Derudover er det en dårlig ide, med try-catch der ignorerer fejl.
Nedenstående burde virke.
public string FileName { get { return this.ImageLocation; } set { if (this.Image != null && !this.Image.IsDisposed) { this.Image.Dispose(); }
this.LoadAsync(value); } }
Hvis den kaster en fejl, kan det være fordi den sættes til at loade et nyt billede, før den er ferdig med at loade det nuværende billede.
Men, kan du ikke komme med fejlmeddelelsen, den giver ofte et godt indtryk af, hvad der er galt.
.NET 2.0 har ikke en .IsDisposed på et image, så jeg kan ikke bruge det ovenstående.
Under alle omstændigheder, så fejler det stadig. Jeg har prøvet alt (!) og så snart jeg går igang med at loade billederne ind asynkront løber jeg ind i problemer.
Jeg har forsøgt at ligge indlæsningen ind i særskilte tråde der så blot returnerer et Image object som jeg kan sætte ind i min Picturebox osv osv osv.
Jeg bliver ved med at få fejl...
Og det er konsekvent "underlige" fejl, fordi debuggeren stopper helt ude ved Application.Run(...), selvom jeg har lagt alverdens try..catch ind
Du har selvfølge ret i at .IsDisposed ikke er på et Image. Der udtalte jeg mig lidt for hurtigt.
Nu prøvede jeg at oprette din klasse, lave Load om til LoadAsync, og loade nogle billeder ind, det hele virkede problemfrit. Det havde været meget nyttigt med en fejlmeddelelse.
Hvis den stopper på Application.Run, plejer det at være fordi man bruger noget reflection! Men jeg vil tro, at det også kan ske med asynkrone operationer. Men uanset, så kan du se på InnerProperty på den exception der bliver kastet Exception, for at få den rigtige fejlmeddelelse.
Jeg snubler lidt over mine egne ord, men jeg håber du forstår hvad jeg mener.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.