首页 新闻 搜索 专区 学院

c# list 怎么多线程安全,谁帮我看怎么封装

0
[待解决问题]

c# list 怎么多线程安全,谁帮我看怎么封装

superstar的主页 superstar | 菜鸟二级 | 园豆:221
提问于:2019-03-07 13:34
< >
分享
所有回答(8)
0

List 不是线程安全的,可以使用 ConcurrentBag ,推荐阅读 Multithreading made easy – Parallel ForEach

dudu | 园豆:39034 (高人七级) | 2019-03-07 14:16

这个是无序的不得啊

支持(0) 反对(0) superstar | 园豆:221 (菜鸟二级) | 2019-03-07 15:08
0

如果你要 封装 List 变成线程安全的话。那么就新建一个类,将List的Add,Remove[] 操作加上同一把锁lock

Shendu.CC | 园豆:1914 (小虾三级) | 2019-03-07 14:33
0

是不是可以结合 redis来实现线程安全,可以利用 redis的锁机制,包括分布式锁机制等等.

jerry-Tom | 园豆:4077 (老鸟四级) | 2019-03-07 14:43
0

c#有专门对的线程安全的集合,可以查查,我忘了叫什么了

会长 | 园豆:8183 (大侠五级) | 2019-03-07 14:57
0

把list操作这段, 加上lock, 就可以啦

风浪 | 园豆:2861 (老鸟四级) | 2019-03-07 15:56
0

一个是加lock,一个是用并发集合

jqw2009 | 园豆:1946 (小虾三级) | 2019-03-07 17:21
0

ConcurrentQueue、ConcurrentDictionary

从今天开始 | 园豆:214 (菜鸟二级) | 2019-03-08 13:42
0

public class ThreadSafeList<T> : IList<T>
{
protected List<T> _interalList = new List<T>();

// Other Elements of IList implementation

public IEnumerator<T> GetEnumerator()
{
    return Clone().GetEnumerator();
}

System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
    return Clone().GetEnumerator();
}

protected static object _lock = new object();

public List<T> Clone()
{
    List<T> newList = new List<T>();

    lock (_lock)
    {
        _interalList.ForEach(x => newList.Add(x));
    }

    return newList;
}

}

class MyList<T> {
private List<T> _list = new List<T>();
private object _sync = new object();
public void Add(T value) {
lock (_sync) {
_list.Add(value);
}
}
public bool Find(Predicate<T> predicate) {
lock (_sync) {
return _list.Find(predicate);
}
}
public T FirstOrDefault() {
lock (_sync) {
return _list.FirstOrDefault();
}
}
}

同样可以试下ImmutableList,ImmutableList<T> 可以索引,但是注意性能问题,不能用它来简单的替代 List<T>。

参考:
https://github.com/dtao/ConcurrentList
https://stackoverflow.com/questions/6601611/no-concurrentlistt-in-net-4-0

又见阿郎 | 园豆:169 (初学一级) | 2019-04-30 17:44
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册