Erzielung gleichzeitiger HashSet-Funktionalität in .NET
Das .NET Framework bietet nicht direkt eine gleichzeitige HashSet-Implementierung. Mehrere Problemumgehungen bieten jedoch eine ähnliche Funktionalität mit Thread-Sicherheit.
Optimale Lösung: ConcurrentDictionary
Die ConcurrentDictionary<TKey, TValue>
-Klasse innerhalb von System.Collections.Concurrent
ist der empfohlene Ansatz. Für eine optimale Speichernutzung verwenden Sie einen byte
als Werttyp. Dies ermöglicht threadsichere Operationen, die das Verhalten eines HashSets widerspiegeln, allerdings mit einer Schlüssel-Wert-Struktur statt nur Schlüsseln.
<code class="language-csharp">private ConcurrentDictionary<string, byte> _data;</code>
Benutzerdefinierte Implementierung (Erweitert)
Sie können ein benutzerdefiniertes gleichzeitiges HashSet erstellen und die Thread-Sicherheit durch Mechanismen wie Sperren gewährleisten. Dies erfordert jedoch sorgfältige Überlegungen und gründliche Tests. Beachten Sie, dass selbst Lesevorgänge auf einem Standard-HashSet
nicht von Natur aus threadsicher sind.
<code class="language-csharp">using System; using System.Collections.Generic; using System.Threading; namespace BlahBlah.Utilities { public class ConcurrentHashSet<T> : IDisposable { // ... (implementation omitted for brevity) } }</code>
ConcurrentBag vermeiden
Von der Verwendung von ConcurrentBag<T>
wird dringend abgeraten. Seine Thread-sicheren Operationen beschränken sich auf das Hinzufügen und Entfernen beliebiger Elemente, wodurch es für Szenarien ungeeignet ist, die ein HashSet-ähnliches Verhalten erfordern (z. B. die Prüfung auf Existenz). Es ist in erster Linie für Produzenten-Konsumenten-Muster konzipiert.
Das obige ist der detaillierte Inhalt vonWie implementiert man gleichzeitige HashSets im .NET Framework?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!