如何实现方法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();
}
}
所以你希望锁超时 - 然后使用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();
}
}