Around and About .NET World

Il blog di Marco Minerva
posts - 1671, comments - 2232, trackbacks - 2135

My Links

News

Contattami su Live Messenger:


MCTS: Windows, Web, Distributed Applications & SQL Server

MCPD: Enterprise Applications

Tag Cloud

Archives

Post Categories

Links

Memory-Mapped File con C# 4.0

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: ,,

Print | posted on mercoledì 18 gennaio 2012 01:18 | Filed Under [ C# .NET 4.0 ]

Feedback

Gravatar

# Comunicazione tra processi diversi con Memory Mapped File

Comunicazione tra processi diversi con Memory Mapped File
17/03/2012 00:03 | Around and About .NET World
Gravatar

# re: Memory-Mapped File con C# 4.0

Esatto, alla fine ti ritrovi a lavorare con un normale Stream, su cui puoi fare Read e Write.
15/04/2012 18:49 | Marco Minerva
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET