do more with less
news, esperienze, esempi da condividere e qualcosa su di me

mercoledì 18 luglio 2007

Dare una mano al Garbage Collector

Qualche tempo fa sono stato chiamato per aiutare un team di sviluppo a risolvere un problema su un'applicazione web che faceva uso dei Web Services di SharePoint. Il problema che il team riscontrava, in ambiente di produzione, nasceva in modo apparentemente random e rendeva la soluzione inutilizzabile in quanto bloccava IIS e richiedeva un reset dello stesso o, nei casi più fortunati, della sola applicazione.
Indagando con i ragazzi che avevano scritto il codice, abbiamo scoperto che il problema risiedeva nel mancato rilascio delle risorse che i Web Services di SharePoint richiedevano. E' bastato adottare la giusta politica di rilascio delle risorse e il problema è rientrato.

Ma perchè sto parlando di questo? Semplicemente perchè a volte, viziati dai molti automatismi che il framework ci mette a disposizione, ci dimentichiamo che il Garbage Collector non può fare miracoli e soprattutto non è in grado di deallocare memoria per risorse su cui non ha il controllo. Ma allora come si possono evitare questi problemi. La risposta è palese, con una corretta programmazione e quindi utilizzando gli eventuali metodi di Dispose o Close che gli oggetti ci mettono a disposizione. Certo questo presuppone che chi implementa gli oggetti, che utilizziamo nella nostra soluzione, esponga i metodi corretti per il rilascio delle risorse (nel caso dei servizi di SharePoint i metodi c'erano ma non erano stati utilizzati) e che noi ci impegnamo ad usare le tecniche migliori per garantire il rilascio delle risorse managed e non.
Un primo passo può essere quello di utilizzare lo statement using per tutti gli oggetti che implementano l'interfaccia IDisposable in modo da sfruttare il rilascio delle risorse al termine dell 'utilizzo delle stesse. Per esempio, ipotizzando di avere una classe MyClass che implementa l'interfaccia IDisposable, potremmo scrivere:

using (MyClass myClass = GetMyClass())
{
myClass.DoSomething();
}

Ed all'interno della nostra classe, quale potrebbe essere il sistema migliore per implementare questa interfaccia? Potremmo adottare il Disposable Pattern così come indicato nell'articolo CLR Inside Out: Digging Into IDisposable di Shawn Farkas pubblicato su MSDN Magazine nel numero di Luglio 2007. Questo articolo aiuta a capire come utilizzare in modo appropriato le tecniche di rilascio delle risorse per evitare i comuni errori che si possono commettere in questi casi. Il risultato della disamina presentata nell'articolo è il seguente pattern:


public class DisposableClass : IDisposable
{
~DisposableClass()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{ //Pulizia di tutte le risorse gestite }
//Pulizia di tutte le risorse native
}
}

 


Buona lettura e occhio alle risorse ;-)

giovedì 5 luglio 2007

Adobe Photoshop CS3: trial installation issue on Windows Vista

Tanto per restare allenati ecco un'altro problema di installazione che ho riscontrato tentando di installare la versione trial di Adobe Photoshop CS3 Extended. Lanciando il file setup.exe, ottenevo il seguente messaggio di errore:

Internal Error 2739

Cercando qua e là ho trovato la soluzione sul forum di Adobe. In sostanza si deve:

  • avviare il command prompt come amministratore
  • eseguire regsvr32 jscript.dll
  • avviare il setup.exe di Photoshop CS3 e tutto funziona.

domenica 1 luglio 2007

Un amico felice...

Oggi Andrea Boschin è stato premiato come Microsoft MVP sulla tecnologia ASP/ASP.NET. Penso che si meriti questo riconoscimento e sono realmente contento di saperlo felice per questo. Congratulazioni Andrea !