我写了一个线程安全列表.但我还需要一种方法.具体来说,我需要一个带有第二个参数-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();
}
}
Run Code Online (Sandbox Code Playgroud)
所以你希望锁定超时 - Monitor.TryEnter然后使用.
public bool TryAdd(T item, int millisecondsTimeout)
{
if(Monitor.TryEnter(_mLock, millisecondsTimeout))
{
try
{
//logic
return true;
}
finally
{
Monitor.Exit(_mLock)
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
更新奖金问题
如果要使迭代器成为线程安全的,那么必须对其进行快照并返回该快照的迭代器.这是一些内置并发集合的功能.这是一个示例实现:
public IEnumerator<T> GetEnumerator()
{
lock(_mLock)
{
//ToList creates a snapshot of the list at this point in time
return _mList.ToList().GetEnumerator();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
445 次 |
| 最近记录: |