2010-09-16 20 views
7

Sto per sviluppare un servizio Windows in C#. Questo servizio deve tenere traccia degli eventi nel sistema e scrivere di volta in volta alcuni dati nei file. Questi eventi in corso formano un certo stato, quindi terrò lo stato in memoria e lo aggiornerò man mano che gli eventi arriveranno. Non voglio complicare eccessivamente le cose, quindi non voglio che lo stato sia persistente su disco, ma mi chiedo se potrei in qualche modo renderlo persistente in memoria, così che se il servizio si arresta in modo anomalo (e il riavvio automatico da parte di Windows) potrebbe riprendere da dove è andato e andare avanti (probabilmente perdendo alcuni eventi, non un grosso problema).Mantenere i dati persistenti in memoria

Stavo pensando di creare un'area di memoria "condivisa", consentendo così a Windows di gestirlo e utilizzarlo solo nel servizio, ma non sono sicuro che l'oggetto persisterà dopo la morte del servizio.

Qualche idea?

EDIT: Non sto cercando una soluzione di overkill. I dati sono un po 'importanti quindi mi piacerebbe tenerlo in attesa in memoria fino al riavvio del servizio, ma i dati non sono troppo importanti. È più di una funzionalità piacevole da poter mantenere i dati facilmente, senza lavorare con file, processi esterni di terze parti e così via. La mia soluzione ideale sarebbe una semplice funzione incorporata (in .NET o in Windows) che mi fornirà una certa persistenza in memoria, giusto per recuperare da un evento di crash.

+0

Checkout: ['PersistentDictionary'] (http://izlooite.blogspot.com/2011/04/persistent-dictionary.html) classe –

risposta

3

È possibile utilizzare un caching block persistente dallo Microsoft Enterprise Library.

È configurabile ed è possibile utilizzare molti backing store come database e storage isolato.

+0

Bello, sembra molto interessante, grazie! –

0

Come utilizzare l'archiviazione isolata e mantenere l'oggetto in memoria in questo modo?

+0

È possibile elaborare" spazio di archiviazione isolato "? –

+1

Controlla il link http://ondotnet.com/pub/a/dotnet/2003/04/21/isolatedstorage.html – Madeleine

+0

Grazie per aver arricchito le mie conoscenze. Tuttavia, questo è anche scrivere su file - e non ho alcun problema di autorizzazione, quindi l'archiviazione isolata non aggiunge valore alla mia situazione. –

2

È possibile utilizzare Memcached o Redis (che persiste anche i dati sul disco, ma lo gestisce automaticamente).

http://code.google.com/p/redis/

Si potrebbe anche dare un'occhiata a questa domanda:

Memcached with Windows and .NET

+1

Memcached e Redis sono interessanti da sapere, ma ho la sensazione che saranno eccessivi. Ho solo bisogno di memorizzare come pochi oggetti con più stringhe e interi in essi. Potrei farlo con l'interazione del disco ma preferisco l'interazione con la memoria per ovvi motivi. Stavo cercando una funzionalità integrata in .NET o Windows. –

+0

Bene, puoi provare e poi decidere se il tuo sentimento è giusto ... comunque il consiglio di jmservera di usare Persistenc Caching Block può essere una buona opzione per te. – mamoo

0

Anche se, per esempio, è mantenere i dati su una memoria condivisa di qualche altra PC collegato in rete , come potreste "garantire" che il pc collegato in rete non si blocchi/si riavvii/si fermi/etc? In tal caso, il servizio perderà comunque i dati persistenti.

Vorrei suggerire, e probabilmente è probabile che tu finisca, memorizzando i dati sullo stesso disco.

Si noti che, a causa della natura volatile della memoria (RAM), non è possibile ricaricare i dati precedentemente presenti, prima del riavvio del sistema; a meno che non si utilizzi un meccanismo per archiviare/ricaricare su disco.

--EDIT--

In questo caso, come sull'utilizzo MSMQ? In questo modo è possibile trasferire tutto sulla coda e, anche se il servizio viene riavviato, cercherà gli elementi nella coda e continuerà in seguito.

+0

Se lo stesso PC viene riavviato, non ho più bisogno dei dati persistenti. Voglio coprire solo i casi estremi in cui il mio servizio si arresta in modo anomalo e si riavvia automaticamente. –

+0

@Eldad: vedere la mia modifica in risposta al tuo commento. –

1

Non vedo perché sarebbe più difficile mantenere il disco.

utilizzando db4o è possibile mantenere le istanze con cui si sta già lavorando.

+0

Non è più difficile persistere su disco. I miei dati sono molto semplici e posso facilmente serializzarli da e verso un file, voglio solo evitare di fare scherzi con il disco, se possibile. I dati non sono così importanti; se riesco a lavorare lo stesso, ma mantenere la memoria al sicuro (più sicuro ...) per il breve periodo di tempo in cui il servizio si riavvia, sarebbe fantastico. –

+0

gestisce gli scenari di errore previsti evitando l'uso non necessario del riavvio automatico e ignorandolo per lo scenario estremo che si blocca ancora/poiché hai già detto che se la casella viene riavviata non ti interessa perdere i dati. – eglasius

+0

Beh, questo è il meglio :-) Ovviamente non ho intenzione di codificare come non mi interessa se il servizio sopravvive. Farò del mio meglio per continuare così, e ancora ... Ma ho bisogno di pesare sul costo di persistere i dati. –

3

So che hai detto che non vuoi complicare eccessivamente le cose persistendo su disco, ma sicuramente sarà molto più complicato continuare a fare cose nella memoria condivisa o in una qualsiasi delle soluzioni elencate qui. Il motivo per cui così tante applicazioni utilizzano database o archiviazione di file è perché è la soluzione più semplice.

Si consiglia di mantenere tutto lo stato in un singolo oggetto o gerarchia di oggetti, serializzare questo oggetto in XML e scriverlo in un file. In realtà non è molto più semplice di così.

+0

Immagino che tu abbia ragione. La mia linea di pensiero era - questo non è un dato MOLTO importante, posso vivere con la perdita. Se potessi modificare qualcosa nel mio codice per renderlo persistente mentre il mio servizio andasse giù e tornasse indietro, senza cambiare molto più di quello, mi piacerebbe. –

+1

Sì, non penso che tu abbia davvero questa opzione. Potresti periodicamente scriverlo su disco, ma non puoi mantenerlo prima che il servizio si interrompa, ad esempio se il server si blocca è già troppo tardi –

Problemi correlati