Ho familiarità con WeakReference
, ma sto cercando un tipo di riferimento che viene cancellato solo quando la memoria è bassa, non semplicemente ogni volta che gc viene eseguito (proprio come Java SoftReference
). Sto cercando un modo per implementare una cache sensibile alla memoria.Equivalente a SoftReference in .net?
risposta
No, non esiste un equivalente. C'è un motivo particolare per cui lo WeakReference
non farà il lavoro?
Ecco una domanda simile al vostro:
Why doesn't .NET have a SoftReference as well as a WeakReference, like Java?
Forse la classe ASP.NET Cache (System.Web.Caching.Cache) potrebbe aiutare a raggiungere ciò che si vuole? Si rimuove automaticamente gli oggetti se la memoria si sta scaricando:
Here's an article che mostra come utilizzare la classe Cache in un'applicazione Windows Form.
Oltre alla cache ASP.NET, esiste il blocco di applicazioni di memorizzazione nella cache del gruppo Microsoft Patterns and Practices.
La cache di ASP.NET vi dà il comportamento della memoria sensibile che si desidera, con l'inconveniente che tutto ha bisogno di una chiave univoca. Tuttavia, dovresti essere in grado di mantenere un WeakReference su un oggetto che hai inserito nella cache di ASP.NET. Il riferimento forte della cache manterrà il GC a bada finché la cache non deciderà che deve essere scavato per liberare memoria. WeakReference ti dà accesso all'oggetto senza fare una ricerca con la chiave di cache.
Foo cachedData = new Foo();
WeakReference weakRef = new WeakReference(cachedData);
HttpRuntime.Cache[Guid.NewGuid().ToString()] = cachedData;
...
if (weakRef.IsAlive)
{
Foo strongRef = weakRef.Target as Foo;
}
è possibile creare una classe SoftReference estendendo WeakReference lungo le linee di
class SoftReference : WeakReference
{
public SoftReference(object target) : base(target)
{
HttpRuntime.Cache[Guid.NewGuid().ToString()] = target;
}
}
Faresti inoltre necessario eseguire l'override del setter sulla strada giusta per fare in modo che qualsiasi nuovo obiettivo va nella cache.
Sebbene un SoftReference
possa sembrare un modo conveniente per implementare il caching della memoria, richiede al runtime Java di determinare in modo un po 'arbitrario se il vantaggio di mantenere un oggetto intorno superi il costo di memorizzarlo. Sfortunatamente, il runtime ha informazioni limitate sul costo reale della conservazione di un oggetto (tenendo presente che il costo reale può comprendere l'impatto dell'utilizzo della memoria di un'applicazione su altre applicazioni) e praticamente nessuna informazione sul vantaggio di mantenere l'oggetto intorno .
Se vale la pena di tenere un oggetto intorno anche quando non ci sono forti riferimenti esterni a esso, una cache dovrebbe mantenere un forte riferimento ad esso (almeno finché sembra degna). Se il vantaggio di mantenere l'oggetto nella cache si estenderà solo finché esiste un riferimento esterno (ad esempio perché la produzione di istanze è economica, ma l'esistenza di due entità logiche che contengono dati identici utilizzano la stessa istanza per trattenerli faciliterebbe il confronto tra tali entità), si dovrebbe usare uno WeakReference
.
Per inciso, se avessi i miei druthers,.net supporterà un altro tipo di riferimento che non ho visto in nessuna piattaforma: un riferimento "di interesse per qualcun altro", che verrebbe utilizzato in combinazione con un tipo di WeakReference
. Un riferimento "di interesse per qualcun altro" potrebbe essere usato come riferimento forte, ma uno WeakReference
opportunamente configurato sarebbe invalidato se gli unici riferimenti forti al suo target fossero "di interesse per qualcun altro". Un tale concetto potrebbe migliorare l'efficienza quando si utilizza un GC concorrente, nei casi in cui un gestore di eventi deboli genererebbe ripetutamente un riferimento forte al proprio target. Se nessuno è realmente interessato a ciò che il gestore di eventi sta facendo con il suo obiettivo, sarebbe auspicabile che il gestore potesse ottenere l'annullamento della sottoscrizione.
- 1. Java equivalente a .NET System.InvalidOperationException
- 2. Java equivalente a .Net NotSupportedException
- 3. equivalente JMS in .Net
- 4. Silverlight 4 Equivalente a .NET Timer Control
- 5. C# .NET equivalente a tempo PHP()
- 6. Esiste un valore .Net equivalente a java.util.concurrent.Executor?
- 7. Equivalente decimale SQL in .NET
- 8. . Equivalente .NET di StrCmpLogicalW
- 9. Equivalente JAXB .NET?
- 10. Equivalente Maven per .Net
- 11. .NET equivalente per GetLastInputInfo?
- 12. .net equivalente di htmlunit?
- 13. Does SoftReference chiama .recycle() sull'oggetto Bitmap
- 14. Equivalente di caricatori di classi in .NET
- 15. Qt equivalente dell'associazione dati .NET?
- 16. Equivalente Java per MEF in .NET
- 17. Esiste .Net TypeConverter equivalente in Java
- 18. Esiste un equivalente di JMS in .NET?
- 19. equivalente in C++ del Task.Delay di .NET?
- 20. .NET MVC FileResult equivalente in Web Form
- 21. Esiste un equivalente di "gettimeofday" in .NET
- 22. Esiste un RRDTool .net equivalente
- 23. AppDomain è equivalente a un processo per codice .NET?
- 24. Qual è equivalente a .NET di InterruptedException (Java)?
- 25. Qual è il .NET 4.5 equivalente a UserNameWSTrustBinding?
- 26. equivalente a WinRT di questi metodi di coltura .Net?
- 27. madSHI MadExcept equivalente per. NET (C#)
- 28. .NET 1.0 Nucleo equivalente per System.Threading.Thread.CurrentThread.ManagedThreadId
- 29. Equivalente PHP di .Net Entity Framework
- 30. .NET equivalente di forceDirectory di Delphi
-1 Tony ha detto che voleva implementare un cache sensibile alla memoria. Eppure MSDN lo dice su WeakReferences: "Evita di utilizzare riferimenti deboli come soluzione automatica ai problemi di gestione della memoria, ma sviluppa una politica di caching efficace per la gestione degli oggetti dell'applicazione". –