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