Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


stor tjock delegat bugg i .net?

Postades av 2003-03-29 20:03:42 - Roger Alsing, i forum asp.net generellt, Tråden har 5 Kommentarer och lästs av 1848 personer

förhindrar eventhanterare objekt från att garbagecollectas?

gör följande:

1) skapa en ny winforms app
2) lägg till en usercontrol
3) i usercontrollens "parentchanged" event gör så att usercontrollen lyssnar på parent containerns "mousemove" event

4) i usercontrollens "dispose" / "finalize / destructor" lägg en "console.writeline ("blah")

5 i mainformen gör följande

form_load(...)
Usercontrol1 uc=new Usercontrol1();
this.controls.add(uc);
uc.visible=true;
uc=null;
this.controls.clear();
GC.Collect();
...


om man startar appen nu så kommer man se att finalize/dispose INTE körs

men om man går tillbax till usercontrollen och remmar ut koden där den kopplar sig på mousemove på parent containern och startar igen , så kommer man se att finalize / dispose körs..


detta kan ju simpelt lösas genom att anropa .dispose() på usercontrollen.
MEN!
enligt msdn så ska man BARA anropa .dispose om objektet håller unmanaged resources eller db kopplingar (som jag antar bakom kulisserna är unmanaged)

och man ska ALDRIG anropa dispose på objekt som inte håller någon unmanaged resouce direkt eller indirekt...


så , ska man eller ska man inte anropa .dispose på windowsforms kontroller om de nu bara innehåller helt vanlig .net kod?????

//Roger







Svara

Sv: stor tjock delegat bugg i .net?

Postades av 2003-03-29 21:20:33 - Fredrik Salomonsson

Hej.

>>enligt msdn så ska man BARA anropa .dispose om objektet håller unmanaged resources eller db kopplingar (som jag antar bakom kulisserna är unmanaged)
>>och man ska ALDRIG anropa dispose på objekt som inte håller någon unmanaged resouce direkt eller indirekt...

Intressant. Hur skall man veta det??
Jag kör _oftast_ enligt regeln: Finns .Dispose(), kör den.

//fredda


Svara

Sv: stor tjock delegat bugg i .net?

Postades av 2003-03-30 11:48:02 - Mattias Sjögren

>förhindrar eventhanterare objekt från att garbagecollectas?

Nja. Det kanske snarare fördröjer det. Eftersom GCn kan hantera cirkulära referenser så kommer de att rensas upp när både hanteraren och den som tillhandahåller händelsen inte refereras nånon annanstans.


>detta kan ju simpelt lösas genom att anropa .dispose() på usercontrollen. MEN!
>enligt msdn så ska man BARA anropa .dispose om objektet håller unmanaged
>resources eller db kopplingar (som jag antar bakom kulisserna är unmanaged)

Alla UserControl objekt (i alla fall om vi snackar Winforms) backas ju av ett HWND, så du kan ju inte ha en winforms kontroll som inte har några "unmanaged" resurser.


MS


Svara

Sv: stor tjock delegat bugg i .net?

Postades av 2003-03-30 12:05:35 - Roger Alsing

oke , helt sant ang hwnd. :)

men! , när blir de cirkulära referenserna upplösta då?

de blir det ju bevisligen inte när man anropar GC.Collect();

//Roger


Svara

Sv: stor tjock delegat bugg i .net?

Postades av 2003-03-30 15:47:56 - Mattias Sjögren

>men! , när blir de cirkulära referenserna upplösta då?

Om du har en kontroll som refererar till ett formulär, och vice versa, så rensas de väl upp vid första GCn efter att du inte längre har några ytterligare referenser till varken formuläret eller kontrollen.


MS


Svara

Sv: stor tjock delegat bugg i .net?

Postades av 2003-03-31 13:27:07 - Roger Alsing

oke , må så vara , känns ändå som att det är 'fel' om de enda referenser som håller objektet vid liv kan vara eventhanterare...

men men..

här kommer ett annat lattjo problem med eventhanterare och winforms timern..


skapa ett winforms projekt
lägg till en usercontrol
lägg en WINDOWSFORMS TIMER (inte den andra) på userkontrollen.
sätt timern till enabled och koppla en eventhanterare på timerns "tick" event
lägg en "console.writeline" i userkontrollens dispose & finalize

gör samma sak som i första exemplet:

form_load(...)
Usercontrol1 uc=new Usercontrol1();
this.controls.add(uc);
uc.visible=true;
uc=null;
this.controls.clear();
GC.Collect();
...



starta appen...

nu kan man se att dispose/finalize inte körs i userkontrollen , och detta är för att timerns eventhanterare håller en ref till kontrollen ..
så även om du kastar alla referenser till den container som håller userkontrollen så kommer userkontrollen fortfarande ligga och kleta i minnet...

enda sättet att få den att dö på är att stänga av timern , och det skulle man ju vilja göra i finalize , då man vet att det inte finns några referenser kvar , MEN eftersom timern förhindrar att finalize körs , så kan vi inte göra detta ...
så det blir lite av ett moment22 här...


i det första fallet , med mousemove hanteraren så är det som MS sa , detta lösesupp när inga refs finns till userkontrollen eller till dess kontainer...

men i detta fallet så kommer userkontrollen ligga och skräpa i minnet för evigt , eller iaf tills du avslutar din app...

någon frisk ide' varför det blir så?

//Roger




Svara

Nyligen

  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo
  • 14:25 Tips på verktyg för att skapa QR-k
  • 14:23 Tips på verktyg för att skapa QR-k
  • 20:52 Fungerer innskuddsbonuser egentlig

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 154
27 952
271 704
883
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies