febbraio 2006 - Posts
Trucco: Chiudere un servizio, creato in .Net (vb.NEt e C#) solo quando ha terminato tutte le operazioni Utilizzando il thread
Nel creare un servizio, a volte può capire l'esigenza che tale servizio deve rimanere attivo, fino a quando non ha eseguito tutte le operazioni (lettura, scrittura e salvataggio dati). Se viene digitato il pulsante stop del servizio, il programma si chiude, senza eventualmente aver eseguito tutte le operazione che voleva eseguire.
Di seguito si riporta del codice, per evitare tutto ciò.
Nella dichiarazione degli oggetti nella classe service, si crei un oggetto di tipo thread:
C#
private
System.Threading.Thread ServiceThread =
(System.Threading.Thread)
null;
VB.Net
Dim ServiceThread As System.Threading.Thread = CType(Nothing,System.Threading.Thread)
Nell'evento onStart del servizio, inizializziamo l'oggetto ServiceThread, creato in precedenza, passandogli come argomento un oggetto di tipo threadStart, il quale avvia la funzione di avvio delle varie operazioni.
C#
protected
override void OnStart(string[] args)
{
//oggetto di tipo threadSTart per gestire l'avvio della funzione
System.Threading.ThreadStart ts =
new System.Threading.ThreadStart(Avvia);
//il processo vero e proprio
ServiceThread = new System.Threading.Thread(ts);
ServiceThread.Start();
}
VB.Net
Protected Overrides Sub OnStart(ByVal args() As String)
'oggetto di tipo threadSTart per gestire l'avvio della funzione
Dim ts As System.Threading.ThreadStart = New System.Threading.ThreadStart(Avvia)
'il processo vero e proprio e poi eseguie la funzione avvia
ServiceThread = New System.Threading.Thread(ts)
ServiceThread.Start
End Sub
A questo punto, il nostro servizio esegue le varie operazioni, nell'evento stop, verifichiamo che tutte le operazioni sono terminate, tramite un enumerato o variabile costruito in precedenza.
protected
override void OnStop()
{
bool
bEsci = false;
while
(bEsci == false )
{
ServiceThread.Join ();
switch (StatoServizio)
{
case Terminato:
bEsci =
true;
break;
case Pausa:
bEsci =
true;
break;
}
}
if
(ServiceThread.IsAlive) ServiceThread.Abort();
//distruggo l'oggetto
ServiceThread = (System.Threading.Thread)
null;
}
VB.Net
Protected Overrides Sub OnStop()
Dim bEsci As Boolean = false
While (bEsci = false)
ServiceThread.Join
Select Case (StatoServizio)
Case Terminato
bEsci = true
Case Pausa
bEsci = true
End Select
End While
If ServiceThread.IsAlive Then
ServiceThread.Abort
End If
'distruggo l'oggetto
ServiceThread = CType(Nothing,System.Threading.Thread)
End Sub
Se vogliamo ottenere il percorso in cui gira il file (.exe) del nostro servizio, possiamo utilizzare la proprietà location dell'oggetto assembly. Di seguito si riporta un esempio
C#
string
sPercorso= this.GetType().Assembly.Location;
int iSlash = sPercorso.LastIndexOf(@"\");
sPercorso= sPercorso.Substring(0, iSlash +1);
VB.Net
Dim sPercorso As String = Me.GetType.Assembly.Location
Dim iSlash As Integer = sPercorso.LastIndexOf("\")
sPercorso = sPercorso.Substring(0, (iSlash + 1))
Per installare un servizio windows, creato con visual studio .net (c# o vb.net) oltre ad utilizzare il pacchetto di installazione, possiamo utilizzare l'utility, InstallUtil.exe.
Il funzionamento è semplice, (dopo aver agguinto al progetto il file projectInstaller (aggiungi programma di installazione)) apriamo il prompt dei comandi di visual studio, situato nella barra dei menu di windows, dove si trova visual studio net.
Una volta aperto, selezioniamo il percorso dove si trova il servizio (file exe) creato, a questo punto una volta posizionati nella cartella di tale servizio, digitiamo nella finestra del prompt di visual studio InstallUtili.exe NomeServizio.exe.
In questo modo verrà installato nei servizi e comparirà nella lista dei servizi.
Se invece lo si vuole disistallare, dovremmo utilizzare il parametro /U, esempio:
InstallUtil.exe /U nomeServizio.exe
Se abbiamo creato in vb.net o c# un servizio, utilizzando l'ambiente di sviluppo visual studio .Net, e volessimo testare tale servizio in debug, dobbiamo seguire la procedura descritta qui di seguito.
Prima cosa, mettere i punti di debug, seconda cosa, consiglio, di mettere delle pause (Thread.sleep(20000))prima della proceudra che si vuole eseguire, in modo che il codice non venga eseguito in tempi rapidi.
Fatto ciò, facciamo partire il nostro servizio, dopo averlo avviato, andiamo in visual studio .Net, dal menu debug, selezioniamo la voce "Processi..." verrà visualizza la finestra dei processi, selezionare il processo (servizio) che si vuole fare il debug. Se non dovesse essere visibile tale servizio, mettete la spunta sull'opzione "Mostra processi di sistema".
Per inserire in un campo di una tabella il valore null, bisogna tenere premuto il tasto CTRL e poi una volta il tasto 0 (zero).
Tenendo premuto il tasto Alt Gr ed il tasto Fine, in una tabella di sql server 2000, ci si posizionerà alla fine dei record di tale tabella. Al contrario, se teniamo il pulsante Alt Gr ed il tasto home (freccia diagonale) ci si posizionerà al primo record della tabella.
Da questo sito http://blogs.ugidotnet.org/AlexBlog/archive/2006/02/10/34649.aspx?Pending=true potete leggere un interessante articolo su come ottenere l'elenco dei db, su navision.
Che dirvi buona lettura :-)
Da questo sito http://www.microsoft.com/italy/launch2005/sqlroad/default.mspx potete vedere il calendario e registrarvi agli eventi gratuiti della Microsoft, su Visual studio 2005 e sql server 2005.
Che dirvi.. buona visione.
DA questo sito http://blog.shareoffice.it/emanuele/archive/2006/02/02/3799.aspx è possibile leggere un trucco su come utilizzare e gestire l'assistente di office (fumetto).