如何实现方法TryAdd(T item,int millisecondsTimeout)

时间:2014-11-28 11:23:01

标签: c# multithreading

我写了一个线程安全列表。但我还需要一种方法。具体来说,我需要一个带有第二个参数-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();
    }
}

1 个答案:

答案 0 :(得分:5)

所以你希望锁定超时 - 然后使用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();
    }
}