এর আরও একটি উত্তর যুক্ত করা যাক। কেন অন্যের উপর এই?
1) সরলতা। আকারের গ্যারান্টি দেওয়ার চেষ্টা করা ভাল এবং ভাল তবে অনাঙ্কিত জটিলতার দিকে নিয়ে যায় যা এর নিজস্ব সমস্যাগুলি প্রদর্শন করতে পারে।
2) আইআরডঅনলি ক্লেকশন কার্যকর করে, এর অর্থ আপনি এর উপর লিনক ব্যবহার করতে পারেন এবং এটি বিভিন্ন ধরণের জিনিসগুলিতে পাস করতে পারেন যা প্রত্যাশাযোগ্য প্রত্যাশা করে।
3) কোন লক না। উপরের অনেকগুলি সমাধান লক ব্যবহার করে যা লকলেস সংগ্রহের ক্ষেত্রে ভুল।
4) একই পদ্ধতি, বৈশিষ্ট্য এবং ইন্টারফেসগুলি সমকালীন কিউইউগুলি সহ কার্যকর করে, আইপিড্রোডসারসনামার কালেকশন সহ, যা আপনি ব্লকিংকলেকশন সহ সংগ্রহটি ব্যবহার করতে চান তা গুরুত্বপূর্ণ।
এই বাস্তবায়নটি সম্ভাব্যভাবে প্রত্যাশার চেয়ে বেশি এন্ট্রি দিয়ে শেষ করতে পারে যদি ট্রিডিকিউ ব্যর্থ হয় তবে এই সংঘটিত হওয়ার ফ্রিকোয়েন্সি বিশেষায়িত কোডের মতো বলে মনে হয় না যা অনিবার্যভাবে সম্পাদনকে বাধাগ্রস্থ করবে এবং তার নিজস্ব অপ্রত্যাশিত সমস্যা তৈরি করবে।
আপনি যদি কোনও আকারের গ্যারান্টি দিতে চান তবে প্রুন () বা অনুরূপ পদ্ধতি প্রয়োগ করা সেরা ধারণা হিসাবে মনে হয় like আপনি অন্যান্য পদ্ধতিতে (ট্রাইডেকিউ সহ) রিডার রাইটারলকস্লিম রিড লকটি ব্যবহার করতে পারেন এবং কেবল ছাঁটাই করার সময় একটি লেখার লক নিতে পারেন।
class ConcurrentFixedSizeQueue<T> : IProducerConsumerCollection<T>, IReadOnlyCollection<T>, ICollection {
readonly ConcurrentQueue<T> m_concurrentQueue;
readonly int m_maxSize;
public int Count => m_concurrentQueue.Count;
public bool IsEmpty => m_concurrentQueue.IsEmpty;
public ConcurrentFixedSizeQueue (int maxSize) : this(Array.Empty<T>(), maxSize) { }
public ConcurrentFixedSizeQueue (IEnumerable<T> initialCollection, int maxSize) {
if (initialCollection == null) {
throw new ArgumentNullException(nameof(initialCollection));
}
m_concurrentQueue = new ConcurrentQueue<T>(initialCollection);
m_maxSize = maxSize;
}
public void Enqueue (T item) {
m_concurrentQueue.Enqueue(item);
if (m_concurrentQueue.Count > m_maxSize) {
T result;
m_concurrentQueue.TryDequeue(out result);
}
}
public void TryPeek (out T result) => m_concurrentQueue.TryPeek(out result);
public bool TryDequeue (out T result) => m_concurrentQueue.TryDequeue(out result);
public void CopyTo (T[] array, int index) => m_concurrentQueue.CopyTo(array, index);
public T[] ToArray () => m_concurrentQueue.ToArray();
public IEnumerator<T> GetEnumerator () => m_concurrentQueue.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator () => GetEnumerator();
// Explicit ICollection implementations.
void ICollection.CopyTo (Array array, int index) => ((ICollection)m_concurrentQueue).CopyTo(array, index);
object ICollection.SyncRoot => ((ICollection) m_concurrentQueue).SyncRoot;
bool ICollection.IsSynchronized => ((ICollection) m_concurrentQueue).IsSynchronized;
// Explicit IProducerConsumerCollection<T> implementations.
bool IProducerConsumerCollection<T>.TryAdd (T item) => ((IProducerConsumerCollection<T>) m_concurrentQueue).TryAdd(item);
bool IProducerConsumerCollection<T>.TryTake (out T item) => ((IProducerConsumerCollection<T>) m_concurrentQueue).TryTake(out item);
public override int GetHashCode () => m_concurrentQueue.GetHashCode();
public override bool Equals (object obj) => m_concurrentQueue.Equals(obj);
public override string ToString () => m_concurrentQueue.ToString();
}