Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [vb.net]Servizio Windows - Oggetto dictionary mi perde le chiavi dopo un po' di tempo

    Salve a tutti,

    Ho sviluppato un servizio windows che utilizza il FileSystemWatcher per controllare i file creati, rinominati e cancellati di un certo percorso di rete.

    Se i nomi di questi file rispettano certe regole allora vanno messi a disposizione di un programma batch piuttosto che di un altro che girano sulla stessa macchina dove gira il servizio.

    Quindi ho una regola (regular expression) per ogni programma, e una chiave per ogni programma che interrogherà il servizio affinchè gli fornisa la lista di file destinati a lui.

    Quindi quello che questo servizio fa è di istanziare un oggetto dictionary, creando n chiavi e inserendo per ciascuna chiave un'oggetto Queue(of string) che verrà popolata dei vari percorsi di file avranno superato con successo la regola per quel programma.

    Questo oggetto poi lo registro con l'ipcChannel per renderlo condiviso fra il server(il servizio) e i vari client (i programmi batch)

    Fin qui tutto ok, lo sviluppo è andato a buon fine e tutto pare funzionare bene... i primi 5 minuti.

    Poi inspiegabilmente si spaccano tutti i client (Errore: La chiave nel dizionario non è stata trovata). Debuggando il servizio ho notato 2 cose:
    La prima è che la variabile del servizio che mantiene la referenza condivisa all'oggetto dictionary se per qualche minuto non viene richiesta svuota le chiavi (VariabileDictionary.Count = 0)
    La seconda cosa è che se metto un timer nel servizio che ogni tanto (nel mio caso 3 minuti) fa una cosa qualsiasi con l'oggetto dizionario... ma anche solo leggere un valore.. questo "svuotamento" non accade. Potrei lasciare così e fregarmene, visto che in questo modo funziona, ma sono curioso di conoscere il problema, se qualcuno di voi lo conosce o lo ha già sperimentato. Mi chiedo se sia il garbage collector...

  2. #2
    Il sospetto che sia il Garbage Collector è venuto anche a me leggendo.
    Premettendo che non ho chiaro il funzionamento del tuo software
    posso consigliarti di approfondire l'argomento cercando su google
    Implementing Disposable Pattern
    o più in generale L'implementazione dell'interfaccia IDisposable in .Net
    è possibile evitare che il GC distrugga il tuo oggetto con GC.SuppressFinalize
    ma si deve aver chiaro che cosa si sta facendo e cmq seguire le linee guida della Microsoft
    al riguardo.
    Se risolvi il problema facci sapere come (senza tener conto del workaround dei tre minuti)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.