Una della novità di C# 4.0 è il supporto ai memory-mapped files. Le nuove classi contenute nel namespace System.IO.MemoryMappedFiles consentono di creare file mappati in memoria che possono essere letti e scritti da processi diversi.
Guardiamo ad esempio una Console Application che apre un memory mapped file e scrive un messaggio al suo interno:
1: static void Main(string[] args)
2: {
3: Console.WriteLine("Scrittura di un messaggio su un memory mapped file...");
4:
5: using (var file = MemoryMappedFile.CreateNew("share", 4096))
6: {
7: using (var writer = file.CreateViewStream())
8: {
9: string str = "Hello World!";
10: Console.WriteLine("Invio del messaggio '{0}' in corso...", str);
11: var data = System.Text.Encoding.Default.GetBytes(str);
12: writer.Write(data, 0, data.Length);
13: }
14:
15: Console.WriteLine("Messaggio inviato.\n");
16: Console.Write("Avvia il reader prima di chiudere.");
17: Console.ReadLine();
18: }
19: }
Alla riga 5 creiamo un nuovo memory mapped file con nome share e dimensione 4096 byte. Successivamente, recuperiamo lo stream associato (riga 7) e vi scriviamo un messaggio (riga 12), come se si trattasse di un normale file.
L'applicazione che legge questo file è speculare:
1: static void Main(string[] args)
2: {
3: Console.WriteLine("Lettura di un messaggio da un memory mapped file...");
4:
5: using (var file = MemoryMappedFile.OpenExisting("share"))
6: {
7: using (var reader = file.CreateViewStream())
8: {
9: var bytes = new byte[32768];
10: int read = reader.Read(bytes, 0, bytes.Length);
11:
12: Console.Write("Messaggio ricevuto: ");
13: string str = System.Text.Encoding.UTF8.GetString(bytes, 0, read).Trim('\0');
14: Console.WriteLine(str);
15: Console.WriteLine();
16: }
17: }
18:
19: Console.Write("Premere un tasto per chiudere.");
20: Console.ReadLine();
21: }
La 5° riga apre il memory mapped file di nome share (quindi lo stesso nome creato nell'altro processo) e ne recupera lo stream associato (riga 7), su cui poi viene effettuata una lettura, alla riga 10.
Come si vede, il tutto è molto semplice ed è coerente con quanto siamo già abituati a fare con tutti gli altri Stream di .NET.
Per approfondire l'argomento, rimando direttamente alla documentazione di MSDN.
Tag di Technorati:
.NET,
Programming,
C#