2009-10-20 5 views
1

J'ai rencontré ce code dans un de mes projets, qui a une fonction statique pour renvoyer un MemoryStream d'un fichier, qui est ensuite stocké dans le cache. Maintenant, la même classe a un constructeur qui permet de stocker un MemoryStream dans une variable privée et de l'utiliser plus tard. Donc, il ressemble à ceci:Stockage de MemoryStream dans le cache

private MemoryStream memoryStream; 

public CountryLookup(MemoryStream ms) 
{ 
    memoryStream = ms; 
} 

public static MemoryStream FileToMemory(string filePath) 
{ 
    MemoryStream memoryStream = new MemoryStream(); 
    ReadFileToMemoryStream(filePath, memoryStream); 

    return memoryStream; 
} 

Utilisation:

Context.Cache.Insert("test", 
       CountryLookup.FileToMemory(
        ConfigurationSettings.AppSettings["test"]), 
       new CacheDependency(someFileName) 
       ); 

Et puis:

CountryLookup cl = new CountryLookup(
       ((MemoryStream)Context.Cache.Get("test")) 
       ); 

Je me demandais qui devrait disposer le MemoryStream et quand? Idéalement, CountryLookup devrait implémenter IDisposable.

Dois-je m'en préoccuper?

Répondre

7

Il est légèrement moche - en particulier, le MemoryStream est dynamique, car il a le concept de la «position actuelle». Pourquoi ne pas simplement stocker un tableau d'octets à la place? Vous pouvez facilement créer plusieurs MemoryStreams qui enveloppent le même tableau d'octets lorsque vous en avez besoin, et vous n'avez pas besoin de vous soucier de l'état. MemoryStreams ne doivent pas être éliminés, mais j'ai tendance à les éliminer par habitude. Si vous effectuez des opérations asynchrones sur eux ou les utilisez à distance, je crois que la disposition fait faire une différence à ce point. Les tableaux d'octets sont simplement plus simples :)

+2

+1, pour stocker le tableau 'byte []' dans le cache - les membres d'instance de 'MemoryStream' ne sont pas sûrs d'être thread-safe. –

Questions connexes