23 messaggi dal 18 febbraio 2011
BrightSoul ha scritto:
Ciao,
posta un po' di codice, cerchiamo di capire dov'è il problema....


Il codice è il seguente (ho omesso il controllo se la voce è null perchè ho bisogno di aggiungere altri dati con la stessa voce):
try
string nameKeyCache = "TmpQuery_" + filtri
var _myItemCache = CacheClass.cache.GetCacheItem(nameKeyCache) as CacheItem;
CacheClass.AddToMyCache(nameKeyCache,
                            dt,
                            new CacheItemPolicy(),
                            TimeSpan.FromSeconds(60000));
...

Non capisco perchè in debug, monitorando i valori in cache con CacheClass.GetAllKeys(), appena dopo aver chiamato "CacheClass.AddToMyCache(...)", è presente la chiave che ho creato, passo ad un'altra procedura e la chiave c'è, ma quando richiamo nuovamente la procedura, prima di eseguire "CacheClass.AddToMyCache(...)", la chiave non esite più.
Non capisco?!?!
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
non è che per caso cambia il nome della chiave?
Metti un breakpoint per assicurarti che il nome sia lo stesso identico. Ad esempio, se il valore della variabile filtri cambia, cambierà anche il nome della chiave.

ciao,
Moreno

Enjoy learning and just keep making
23 messaggi dal 18 febbraio 2011
No,
ho verificato attentamente e non viene memorizzata nessun'altra voce che assomigli neanche lontanamente al nome della mia chiave.
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


ho verificato attentamente e non viene memorizzata nessun'altra voce che assomigli neanche lontanamente al nome della mia chiave.

Mmmmh. No, io volevo sapere alla seconda richiesta, quando vai a recuperare l'oggetto dalla cache, se stai usando la stessa chiave. Hai scritto:
passo ad un'altra procedura e la chiave c'è, ma quando richiamo nuovamente la procedura, prima di eseguire "CacheClass.AddToMyCache(...)", la chiave non esite più.

La mia idea è che quando richiami nuovamente la procedura tu stia usando un'altra chiave che ti dà l'illusione che l'oggetto sia stato rimosso dalla cache.
L'oggetto rimane in cache per 60000 secondi, come da tua disposizione. Può sparire solo dopo che questo tempo è trascorso, se riavii l'applicazione, o se il server ha talmente poca memoria RAM residua che è costretto a svuotare la cache.

Facciamo così, ti mando un progetto funzionante, così puoi esaminarlo e vedere in cosa si differenzia dal tuo.
Ho adottato l'esempio che ti avevo mandato. Scarica il progetto da qui:
https://1drv.ms/u/s!Ao4rhSdtDw8rge5aSI7d16pwCJ-ZEw
E guarda in particolare il codefile della pagina Default.aspx.
protected void Page_Load(object sender, EventArgs e)
{
    //Il valore della chiave qui lo imposto staticamente
    //ma lo posso comporre in base ai filtri selezionati
    var chiaveCache = "Risultati"; 
    var dataTable = GenericCacheClass.GetCacheItem(chiaveCache)?.Value as DataTable;
    if (dataTable == null)
    {
        //Il datatable non si trovava in cache, quindi devo ottenerlo inviando una query al database
        dataTable = RecuperaDatiDalDatabase();
        //lo metto in cache per 20 secondi (ma può essere 20 minuti, 6 ore o altro valore adeguato)
        GenericCacheClass.AddToMyCache(chiaveCache, dataTable, null, TimeSpan.FromSeconds(20));
    }

    //Infine, sia che il datatable sia stato recuperato dalla cache che dal database,
    //lo metto in binding con un datagrid
    gridView1.DataSource = dataTable;
    gridView1.DataBind();

}

private DataTable RecuperaDatiDalDatabase()
{
    //In questo esempio non recupero i valori dal database ma creo un DataTable a mano
    //Nell'applicazione reale qui bisognerà collegarsi al db e inviare la query
    var dt = new DataTable();
    dt.Columns.Add("Nome", typeof(string));
    dt.Columns.Add("UltimoAggiornamento", typeof(DateTime));

    //Aggiungo giusto una riga con la data/ora corrente
    //Continuando ad aggiornare la pagina, si vedrà sempre la stessa data/ora per 20 secondi
    //tempo di durata della cache. Dopodiché il valore verrà espulso automaticamente dalla
    //cache e andremo a rieseguire questa funzione per recuperare di nuovo i dati dal db
    dt.Rows.Add("Mario", DateTime.Now);

    return dt;
}


ciao,
Moreno
Modificato da BrightSoul il 26 maggio 2018 12.23 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.