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


Testa finalizer

Postades av 2008-05-21 00:04:03 - Martin Adrian, i forum c# (c-sharp), Tråden har 3 Kommentarer och lästs av 867 personer

Har en klass som innehåller en SafeHandle ärvd typ.

Finns det någon möjlighet att testa att ReleaseHandle gör det den ska i finalizern?

(Det är en ganska enkel funktion så det finns egentligen ingen anledning att testa den men jag blev nyfiken på om det är möjligt)


Svara

Sv: Testa finalizer

Postades av 2008-05-21 08:50:20 - Ola Lindfeldt

Sätt objektet till null, sen GC.Collect()
obs endast för testning, ej bra prestanda att tvinga GC att städa för ofta.


Svara

Sv: Testa finalizer

Postades av 2008-05-21 08:53:35 - Chris Klug

Du bör implementer IDisposable interfacet istället för att bara implementera en finalizer. Det finns dessutom ett pattern från MS för hur det ska gå till.
Implementera IDisposable's Dispose genom att anropa en protected viod Disposable(bool disposing) som du skapat. Anropa den med true. I den metoden rensar du upp allt du vill i dispose om disposing=true. Från Finalizern anropar du metoden med false. På detta vis vet du i Disposing metoden om det är en finalizer eller dispose som anropats och kan handla ut ifrån detta, dvs inte förutsätta att du kan anrop metoder på andra objekt om det är finalizern osv. Sen ska du dessutom hålla koll på om Dispose anropats och kasta en ObjectDisposedException ifrån alla metoder och properties som anropas efter. Typ:

public class MyClass : IDisposable
{
   bool _disposed = false;
   public void MyMethod()
   {
      if (_disposed)
         throw new ObjectDisposedException();
      // Do something
   }
   public void Dispose()
   {
      Dispose(true);
   }   
   public void Dispose(bool disposing)
   {
      if (disposing)
      {
          // Städa upp. Alla objekt finns kvar och kan anropas. 
          // Anropa dispose på andra objekt osv...
          // Hindra GC:n att finaliza
          GC.SupressFinalize();
          _disposed = true;
      }
      // Sätt alla objekt till null och gör det som kan göras från finalizern...
      // Objekt kan vara finalizade
   }
   ~MyClass()
   {
      Dispose(false);
   }
}


På så vis kan du debugga din finalizer genom att bara anropa Dispose och dessutom är det "rätt" gjort.

Alternativet är att skapa ditt objekt. Sätta referencen till null och sedan anropa Garbage Collectorn (GC.Collect()). På detta vis kan du debugga din finalizer. Men du bör implementera IDisposable. Annars kommer du försena frigörande av minne med mera. Behövs en finalizer ska det i princip alltid implementeras IDisposable för att låta användaren frigöra minnet...


Svara

Sv:Testa finalizer

Postades av 2008-05-21 14:07:18 - Martin Adrian

Lite mer förklaring.

Jag har en klass som är en wrapper för en dll som kräver att man loggar in och loggar ut.

Därför har jag skapat en CriticalHandle (som är en SafeHandle utan refcount) som ser ut så här:

private class MySafeHandle : CriticalHandle {
public MySafeHandle(IntPtr p) : CriticalHandle(IntPtr.Zero) {
SetHandle(p);
}
public virtual bool IsInvalid { get { return handle == IntPtr.Zero; } }

protected virtual bool ReleaseHandle() override {
WrappedObject.LogOut(handle); return true;
}
}

Min klass ser sedan ut så här:

public class Wrapper : IDisposable {
private MySafeHandle myhandle;
public Wrapper() {
myhandle = new MySafeHandle(WrappedObject.Login());
}
public void Dispose() {
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing) {
if (myHandle != null && !myHandle.IsInvalid)
myHandle.Dispose();
}
}


Som jag sa så är ReleaseHandle så enkel i det här fallet att den inte behöver testas men tänk om den vore mer avancerad. Kanske det behövs en invoke för att göra logout i rätt tråd.

Som Chris sa så skulle jag ju via reflection kunna anropa Dispose(false). Dispose(false) leder dock till Dispose(true) för safehandler så blir det verkligen samma sak? En skillnad är ju också att anropet inte sker från GC tråden.


Svara

Nyligen

  • 19:55 kick-off med fokus på hälsa?
  • 19:53 kick-off med fokus på hälsa?
  • 16:24 Föreslå en skönhetsklinik online
  • 16:23 Föreslå en skönhetsklinik online
  • 18:42 Hvor finder man håndlavede lamper
  • 18:41 Hvor finder man håndlavede lamper
  • 16:36 Allt du behöver veta om keramiskt
  • 16:14 Vem anlitar man egentligen när tak

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 570 707
27 958
271 751
681
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