如何实现方法TryAdd(T项,整数毫秒超时)

本文关键字:整数 超时 TryAdd 何实现 实现 方法 | 更新日期: 2023-09-27 18:32:24

我写了一个线程安全列表。但我还需要一种方法。具体来说,我需要一个带有第二个参数 -1 的方法,以便根据需要线程等待,并且该元素刚刚进入集合。有一些代码:

public sealed class ThreadSafeList<T>: IEnumerable
{
    private readonly List<T> _mList = new List<T>();
    private readonly object _mLock = new object();
    public void Add(T value)
    {
        lock (_mLock)
        {
            _mList.Add(value);
        }
    }
    public bool TryRemove(T value)
    {
        lock (_mLock)
        {
            return _mList.Remove(value);
        }
    }
    public IEnumerator<T> GetEnumerator()
    {
        return ((IEnumerable<T>) _mList).GetEnumerator();
    }
    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

如何实现方法TryAdd(T项,整数毫秒超时)

所以你希望锁超时 - 然后使用Monitor.TryEnter

public bool TryAdd(T item, int millisecondsTimeout)
{
    if(Monitor.TryEnter(_mLock, millisecondsTimeout))
    {
        try
        {
            //logic
            return true;
        }
        finally 
        {
            Monitor.Exit(_mLock)
        }
    }
    return false;
}

更新奖金问题

如果要使迭代器线程安全,则必须拍摄它的快照并返回该快照的迭代器。这是某些内置并发集合的作用。下面是一个示例实现:

public IEnumerator<T> GetEnumerator()
{
    lock(_mLock)
    {
        //ToList creates a snapshot of the list at this point in time
        return _mList.ToList().GetEnumerator();
    }
}