You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
2.5 KiB
106 lines
2.5 KiB
5 years ago
|
#if NET20 || NET30 || NET35 || !NET_4_6
|
||
|
|
||
|
using System.Collections.Generic;
|
||
|
using System.Diagnostics;
|
||
|
using System.Linq;
|
||
|
using System.Runtime.InteropServices;
|
||
|
//using System.Security.Permissions;
|
||
|
using LinqInternal.Collections;
|
||
|
using LinqInternal.Collections.ThreadSafe;
|
||
|
|
||
|
namespace System.Collections.Concurrent
|
||
|
{
|
||
|
[SerializableAttribute]
|
||
|
[ComVisible(false)]
|
||
|
[DebuggerDisplay("Count = {Count}")]
|
||
|
//[HostProtection(SecurityAction.LinkDemand, Synchronization = true, ExternalThreading = true)]
|
||
|
public class ConcurrentQueue<T> : IProducerConsumerCollection<T>, IReadOnlyCollection<T>
|
||
|
{
|
||
|
private readonly SafeQueue<T> _wrapped;
|
||
|
|
||
|
public ConcurrentQueue()
|
||
|
{
|
||
|
_wrapped = new SafeQueue<T>();
|
||
|
}
|
||
|
|
||
|
public ConcurrentQueue(IEnumerable<T> collection)
|
||
|
{
|
||
|
_wrapped = new SafeQueue<T>(collection);
|
||
|
}
|
||
|
|
||
|
public int Count
|
||
|
{
|
||
|
get { return _wrapped.Count; }
|
||
|
}
|
||
|
|
||
|
public bool IsEmpty
|
||
|
{
|
||
|
get { return _wrapped.Count == 0; }
|
||
|
}
|
||
|
|
||
|
bool ICollection.IsSynchronized
|
||
|
{
|
||
|
get { return false; }
|
||
|
}
|
||
|
|
||
|
object ICollection.SyncRoot
|
||
|
{
|
||
|
get { throw new NotSupportedException(); }
|
||
|
}
|
||
|
|
||
|
public void CopyTo(T[] array, int index)
|
||
|
{
|
||
|
Extensions.CanCopyTo(Count, array, index);
|
||
|
Extensions.CopyTo(this, array, index);
|
||
|
}
|
||
|
|
||
|
public void Enqueue(T item)
|
||
|
{
|
||
|
_wrapped.Add(item);
|
||
|
}
|
||
|
|
||
|
public IEnumerator<T> GetEnumerator()
|
||
|
{
|
||
|
return _wrapped.GetEnumerator();
|
||
|
}
|
||
|
|
||
|
void ICollection.CopyTo(Array array, int index)
|
||
|
{
|
||
|
Extensions.CanCopyTo(Count, array, index);
|
||
|
this.DeprecatedCopyTo(array, index);
|
||
|
}
|
||
|
|
||
|
IEnumerator IEnumerable.GetEnumerator()
|
||
|
{
|
||
|
return GetEnumerator();
|
||
|
}
|
||
|
|
||
|
bool IProducerConsumerCollection<T>.TryAdd(T item)
|
||
|
{
|
||
|
_wrapped.Add(item);
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
bool IProducerConsumerCollection<T>.TryTake(out T item)
|
||
|
{
|
||
|
return _wrapped.TryTake(out item);
|
||
|
}
|
||
|
|
||
|
public T[] ToArray()
|
||
|
{
|
||
|
return _wrapped.ToArray();
|
||
|
}
|
||
|
|
||
|
public bool TryDequeue(out T result)
|
||
|
{
|
||
|
return _wrapped.TryTake(out result);
|
||
|
}
|
||
|
|
||
|
public bool TryPeek(out T result)
|
||
|
{
|
||
|
return _wrapped.TryPeek(out result);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endif
|