Avatar billede carstensuurland Nybegynder
09. februar 2009 - 21:00 Der er 5 kommentarer

PictureBox.LoadAsync sammen med Dispose af Image

Hej Eksperter (og gerne Arne... ;-)

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.

Hilsen Carsten
Avatar billede aaberg Nybegynder
09. februar 2009 - 22:19 #1
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.
Avatar billede aaberg Nybegynder
09. februar 2009 - 22:22 #2
Forøvrigt, når man bruger LoadAsync, skal man huske at sætte WaitOnLoad propertien til false. Gør eventuelt dette i konstruktøren.
Avatar billede carstensuurland Nybegynder
09. februar 2009 - 23:46 #3
.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
Avatar billede aaberg Nybegynder
10. februar 2009 - 08:52 #4
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.
Avatar billede aaberg Nybegynder
10. februar 2009 - 08:54 #5
Jeg snubler lidt over mine egne ord, men jeg håber du forstår hvad jeg mener.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester