csharp ConcurrentQueue使用锁在旧的.NET项目中使用(如在Unity3D中)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了csharp ConcurrentQueue使用锁在旧的.NET项目中使用(如在Unity3D中)相关的知识,希望对你有一定的参考价值。

using System;
using System.Collections.Generic;

namespace KanameExtensions {
    public class ConcurrentQueue<T> {
        //private vars
        private readonly object syncLock = new object();
        private Queue<T> rqueue;

        //constructors
        public ConcurrentQueue() {
            rqueue = new Queue<T>();
        }

        public ConcurrentQueue(IEnumerable<T> collection) {
            rqueue = new Queue<T>(collection);
        }

        public ConcurrentQueue(int capacity) {
            rqueue = new Queue<T>(capacity);
        }

        //properties
        public int Count {
            get {
                lock (syncLock) {
                    return rqueue.Count;
                }
            }
        }

        //methods
        public void Clear() {
            lock (syncLock) {
                rqueue.Clear();
            }
        }

        public bool Contains(T obj) {
            lock (syncLock) {
                return rqueue.Contains(obj);
            }
        }

        public void CopyTo(T[] array, int index) {
            lock (syncLock) {
                rqueue.CopyTo(array, index);
            }
        }

        public T Dequeue() {
            lock (syncLock) {
                return rqueue.Dequeue();
            }
        }

        public void Enqueue(T obj) {
            lock (syncLock) {
                rqueue.Enqueue(obj);
            }
        }

        public bool Equals(T obj) {
            lock (syncLock) {
                return rqueue.Equals(obj);
            }
        }

        public Queue<T>.Enumerator GetEnumerator() {
            lock (syncLock) {
                return rqueue.GetEnumerator();
            }
        }

        public new virtual int GetHashCode() {
            lock (syncLock) {
                return rqueue.GetHashCode();
            }
        }

        public new Type GetType() {
            lock (syncLock) {
                return rqueue.GetType();
            }
        }

        public T Peek() {
            lock (syncLock) {
                return rqueue.Peek();
            }
        }

        public T[] ToArray() {
            lock (syncLock) {
                return rqueue.ToArray();
            }
        }

        public new virtual string ToString() {
            lock (syncLock) {
                return rqueue.ToString();
            }
        }

        public void TrimExcess() {
            lock (syncLock) {
                rqueue.TrimExcess();
            }
        }
    }
}

以上是关于csharp ConcurrentQueue使用锁在旧的.NET项目中使用(如在Unity3D中)的主要内容,如果未能解决你的问题,请参考以下文章

evpp性能测试: 对无锁队列boost::lockfree::queue和moodycamel::ConcurrentQueue做一个性能对比测试

C#:高效的线程安全队列ConcurrentQueue<T>

使用并发集合

如何使用ConcurrentQueue进行线程处理

Task+ConcurrentQueue多线程编程

在托管 c++/.net 4.0 中创建对象的 ConcurrentQueue