আমার একটি দৃশ্যাবলী রয়েছে যেখানে আমার একাধিক থ্রেড যুক্ত রয়েছে যা একটি সারিতে এবং একই সারি থেকে একাধিক থ্রেড পড়ছে। যদি সারি একটি নির্দিষ্ট আকারে পৌঁছে যায় তবে ক্রেটটি পূরণ করা সমস্ত থ্রেড ক্রু থেকে কোনও আইটেম সরিয়ে না দেওয়া পর্যন্ত যোগে অবরুদ্ধ করা হবে।
নীচের সমাধানটি হ'ল আমি এখনই যা ব্যবহার করছি এবং আমার প্রশ্ন হ'ল এটি কীভাবে উন্নত করা যায়? ছাত্রলীগে আমার ব্যবহার করা উচিত এমন কোনও বস্তু ইতিমধ্যে সক্ষম করেছে?
internal class BlockingCollection<T> : CollectionBase, IEnumerable
{
//todo: might be worth changing this into a proper QUEUE
private AutoResetEvent _FullEvent = new AutoResetEvent(false);
internal T this[int i]
{
get { return (T) List[i]; }
}
private int _MaxSize;
internal int MaxSize
{
get { return _MaxSize; }
set
{
_MaxSize = value;
checkSize();
}
}
internal BlockingCollection(int maxSize)
{
MaxSize = maxSize;
}
internal void Add(T item)
{
Trace.WriteLine(string.Format("BlockingCollection add waiting: {0}", Thread.CurrentThread.ManagedThreadId));
_FullEvent.WaitOne();
List.Add(item);
Trace.WriteLine(string.Format("BlockingCollection item added: {0}", Thread.CurrentThread.ManagedThreadId));
checkSize();
}
internal void Remove(T item)
{
lock (List)
{
List.Remove(item);
}
Trace.WriteLine(string.Format("BlockingCollection item removed: {0}", Thread.CurrentThread.ManagedThreadId));
}
protected override void OnRemoveComplete(int index, object value)
{
checkSize();
base.OnRemoveComplete(index, value);
}
internal new IEnumerator GetEnumerator()
{
return List.GetEnumerator();
}
private void checkSize()
{
if (Count < MaxSize)
{
Trace.WriteLine(string.Format("BlockingCollection FullEvent set: {0}", Thread.CurrentThread.ManagedThreadId));
_FullEvent.Set();
}
else
{
Trace.WriteLine(string.Format("BlockingCollection FullEvent reset: {0}", Thread.CurrentThread.ManagedThreadId));
_FullEvent.Reset();
}
}
}