Gå til innhold

Få kode i et class library til å kjøre når prog. avsluttes


Anbefalte innlegg

Altså... Finnes det noe lignendes Form_Closing eventen som kan implementeres i et class library?

 

Har en klasse som lastes (databaseklasse) og åpner en database... Jeg vil at den skal kjøre noe kode (Commit'e transactionen) når host-programmet avsluttes...

 

Noen måte å gjøre dette på, uten å manuelt skrive det i Form_Closing'en til programmet?

 

 

Merk: Det er ikke snakk om en SQL database, men en DB4O database... Just for info :D

Endret av Wubbable
Lenke til kommentar
Videoannonse
Annonse
  • 3 uker senere...

Jeg vil foreslå at du implementerer IDispose (eller var det IDisposing?) interfacet. Da kan du garantere at koden din kjøres en eller annen gang etter at objektet ditt ikke lenger er referert. (Dvs. at det er GarbageCollector som faktisk kaller din Dispose)

 

Jeg fant en kodesnutt på MSDN som viste eksempel på implementering av IDispose

 

Cato

Lenke til kommentar
GC kaller da destructoren, Dispose må du kalle selv, enten med using, eller IDisposable.Dispose();

 

Eller har jeg missforstått noe nå?

Jeg tror ikke GC gjør noe som helst med IDisposable....

 

Du har rett - jeg tok dette etter hukommelsen, og i den koden jeg kopierte så kaller destructoren Dispose (og det er i tillegg en variabel for å sjekke om du allerede har kjørt "dispose" koden

 

    public class MyDisposableClass: IDisposable
   {
       private bool disposed= false; // Indicates that the object is disposed

       // Allow your Dispose method to be called multiple times,
       // but throw an exception if the object has been disposed.
       // Whenever you do something with this class, 
       // check to see if it has been disposed.
       public void DoSomething()
       {
          if(this.disposed)
          {
             throw new ObjectDisposedException();
          }
       }

      #region IDisposable Members

       // Implement IDisposable.
       // Do not make this method virtual.
       // A derived class should not be able to override this method.
       public void Dispose()
       {
           Dispose(true);
           // Take yourself off the Finalization queue 
           // to prevent finalization code for this object
           // from executing a second time.
           GC.SuppressFinalize(this);
       }

       #endregion

       // Dispose(bool disposing) executes in two distinct scenarios.
       // If disposing equals true, the method has been called directly
       // or indirectly by a user's code. Managed and unmanaged resources
       // can be disposed.
       // If disposing equals false, the method has been called by the 
       // runtime from inside the finalizer and you should not reference 
       // other objects. Only unmanaged resources can be disposed.
       protected virtual void Dispose(bool Disposing)
       {
           // Check to see if Dispose has already been called.
           if (!this.disposed)
           {
               // If disposing equals true, dispose all managed 
               // and unmanaged resources.
               if (Disposing)
               {
                   // Dispose managed resources.
               }
               // Release unmanaged resources. If disposing is false, 
               // only the following code is executed.
           }
           disposed = true;
       }

       // Use C# destructor syntax for finalization code.
       // This destructor will run only if the Dispose method 
       // does not get called.
       // It gives your base class the opportunity to finalize.
       // Do not provide destructors in types derived from this class.
       ~MyDisposableClass()
       {
           // Do not re-create Dispose clean-up code here.
           // Calling Dispose(false) is optimal in terms of
           // readability and maintainability.
           Dispose(false);
       }

       // Can be used if calling Close makes more sense for your objects
       // Do not make this method virtual.
       // A derived class should not be allowed
       // to override this method.
       public void Close()
       {
           // Calls the Dispose method without parameters.
           Dispose();
       }

 

Cato

Lenke til kommentar
Har en klasse som lastes (databaseklasse) og åpner en database... Jeg vil at den skal kjøre noe kode (Commit'e transactionen) når host-programmet avsluttes...

 

En liten ting som egentlig ikke har noe med spørsmålet ditt å gjøre, men du bør ikke holde en transaksjon åpen hele levetiden til applikasjonen din. Du bør committe den så raskt som mulig. Hvis ikke kommer du til å ende opp med masse locking-problemer.

Lenke til kommentar

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...