Gå til innhold

C#: [Løst]Exception:"Cannot access a disposed object" ved Close() på form.


Anbefalte innlegg

Her er koden som utløser det:

 

if (this.InvokeRequired)

{

this.Invoke(new FormClose(CloseForm));

}

else

{

this.Close();

}

 

Dette blir kjørt i slutten av en eventhandler som kjører i en annen tråd en gui tråden.

Noen ganger gjør den faktisk ikke det(this.InvokeRequired er noen ganger = false), men denne feilmeldingen kommer uansett.

Jeg lukker kun formet i disse linjene og ikke noe annet sted.

Har forsøkt å fange Disposed() eventen med den fyres aldri av virker det som, eventhandleren oppdager ihvertfall ikke noe.

Formet er vist med ShowDialog().

 

Kanskje det er noe jeg har oversett? :hrm:

Står helt fast på denne.....

 

Edit:

CloseForm som delegaten viser til er kun dette: this.Close();

Endret av Techster
Lenke til kommentar
Videoannonse
Annonse
Her er koden som utløser det:

 

if (this.InvokeRequired)

{

this.Invoke(new FormClose(CloseForm));

}

else

{

this.Close();

}

 

Dette blir kjørt i slutten av en eventhandler som kjører i en annen tråd en gui tråden.

Noen ganger gjør den faktisk ikke det(this.InvokeRequired er noen ganger = false), men denne feilmeldingen kommer uansett.

Jeg lukker kun formet i disse linjene og ikke noe annet sted.

Har forsøkt å fange Disposed() eventen med den fyres aldri av virker det som, eventhandleren oppdager ihvertfall ikke noe.

Formet er vist med ShowDialog().

 

Kanskje det er noe jeg har oversett? :hrm:

Står helt fast på denne.....

 

Edit:

CloseForm som delegaten viser til er kun dette: this.Close();

 

 

Løsning:

this.DialogResult = DialogResult.OK ble satt like før if'en.

Ikke visste jeg at den disposed formet da.

Det er vel fordi formet vises med ShowDialog og ikke Show, men rart at den disposer det bare DialogResult blir satt. Snodig.

Endret av Techster
Lenke til kommentar

Dette er ikke heeelt relatert til det du gjør, men kanskje det kan hjelpe allikevel.

 

Når jeg kjører andre tråder i et GUI program, så pleier jeg alltid å gjøre dette:

 

- Legg til

volatile bool app_running;

 

- Override OnClosing og la den vente til alle tråder er avsluttet

app_running = false;
while(da_thread.IsAlive)
 Application.DoEvents();

 

Så hvis jeg da har en

 

void RenderThread()
{
 while(app_running)
 {
Invoke(new RenderInvokeDelegate(Render));
Thread.Sleep(0);
 }
}

Lenke til kommentar
  • 2 uker senere...

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...