আপনার বাস্তবায়ন সঠিক। দুর্ভাগ্যক্রমে .NET ফ্রেমওয়ার্ক একটি অন্তর্নির্মিত সমবর্তী হ্যাশসেট প্রকার সরবরাহ করে না। যাইহোক, কিছু কর্মক্ষেত্র আছে।
সমকালীন অভিধান (প্রস্তাবিত)
এই প্রথমটি হ'ল ConcurrentDictionary<TKey, TValue>
নামস্থানে ক্লাসটি ব্যবহার করা System.Collections.Concurrent
। ক্ষেত্রে মানটি অর্থহীন, তাই আমরা একটি সাধারণ byte
(মেমরিতে 1 বাইট) ব্যবহার করতে পারি ।
private ConcurrentDictionary<string, byte> _data;
এটি প্রস্তাবিত বিকল্প কারণ ধরণটি থ্রেড-সেফ এবং আপনাকে HashSet<T>
কী এবং মান ব্যতীত আলাদা আলাদা বস্তু ব্যতীত একই সুবিধা প্রদান করে।
সূত্র: সোস্যাল এমএসডিএন
ConcurrentBag
সদৃশ এন্ট্রিগুলি সম্পর্কে যদি আপনার আপত্তি না থাকে তবে আপনি ConcurrentBag<T>
পূর্ববর্তী শ্রেণীর একই নামের জায়গায় ক্লাসটি ব্যবহার করতে পারেন ।
private ConcurrentBag<string> _data;
স্ব-বাস্তবায়ন
অবশেষে, আপনি যেমনটি করেছিলেন, আপনি লক বা অন্যান্য উপায়গুলি ব্যবহার করে আপনার নিজস্ব ডেটা টাইপ প্রয়োগ করতে পারেন। নেট আপনাকে থ্রেড-সেফ হিসাবে সরবরাহ করে। এখানে একটি দুর্দান্ত উদাহরণ: কীভাবে। নেট এ সাম্প্রতিক হ্যাশসেটটি প্রয়োগ করা যায়
এই সমাধানের একমাত্র অপূর্ণতা হ'ল টাইপটি HashSet<T>
আনুষ্ঠানিকভাবে একযোগে অ্যাক্সেস করে না, এমনকি পড়া অপারেশনগুলির জন্যও।
আমি লিঙ্কযুক্ত পোস্টের কোডটি উদ্ধৃত করি (মূলত বেন মোশার লিখেছেন )।
using System;
using System.Collections.Generic;
using System.Threading;
namespace BlahBlah.Utilities
{
public class ConcurrentHashSet<T> : IDisposable
{
private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
private readonly HashSet<T> _hashSet = new HashSet<T>();
#region Implementation of ICollection<T> ...ish
public bool Add(T item)
{
_lock.EnterWriteLock();
try
{
return _hashSet.Add(item);
}
finally
{
if (_lock.IsWriteLockHeld) _lock.ExitWriteLock();
}
}
public void Clear()
{
_lock.EnterWriteLock();
try
{
_hashSet.Clear();
}
finally
{
if (_lock.IsWriteLockHeld) _lock.ExitWriteLock();
}
}
public bool Contains(T item)
{
_lock.EnterReadLock();
try
{
return _hashSet.Contains(item);
}
finally
{
if (_lock.IsReadLockHeld) _lock.ExitReadLock();
}
}
public bool Remove(T item)
{
_lock.EnterWriteLock();
try
{
return _hashSet.Remove(item);
}
finally
{
if (_lock.IsWriteLockHeld) _lock.ExitWriteLock();
}
}
public int Count
{
get
{
_lock.EnterReadLock();
try
{
return _hashSet.Count;
}
finally
{
if (_lock.IsReadLockHeld) _lock.ExitReadLock();
}
}
}
#endregion
#region Dispose
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
if (_lock != null)
_lock.Dispose();
}
~ConcurrentHashSet()
{
Dispose(false);
}
#endregion
}
}
সম্পাদনা: প্রবেশদ্বার লক পদ্ধতিগুলি try
ব্লককে ছাড়িয়ে যান , কারণ তারা একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারে এবং finally
ব্লকগুলিতে থাকা নির্দেশাবলী কার্যকর করতে পারে ।
System.Collections.Concurrent