亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

多線程枚舉安全的List

2019-11-14 13:54:59
字體:
來源:轉載
供稿:網友

  最近在做windows runtime下APP開發的工作。在Service層請求返回后,往往會通過回調的形式來通知UI更新數據。多個線程操作經常出現foreach拋出異常:System.InvalidOperationException: 集合已修改;可能無法執行枚舉操作,導致APP crash。

  在網上搜索了一下,得出以下結論:

  1.   實現一個真正線程安全的List是很困難的,具體可以參考這篇Why are thread safe collections so hard?。
  2.   使用ConcurrentBag<T>,微軟給出的線程安全的集合,缺點是unordered。如果集合依賴內部元素的順序,就不太合適了。
  3.   實現一個枚舉安全的List,所需的工作量相對小很多,甚至僅需要給已用到的List操作加上lock。

  以下是一個最小化實現的枚舉安全的List。因為實際工程中,需要枚舉安全的集合僅用到了Add,Count,索引等操作,所以繼承了IEnumerable接口,而不是IList。同時也不影響使用Linq to objects的擴展方法,真是偷了一個大懶。

    class EnumerationSafeList<T> : IEnumerable<T>    {        PRivate List<T> innerList = new List<T>();        private object lockObject = new object();        public IEnumerator<T> GetEnumerator()        {            return Clone().GetEnumerator();        }        IEnumerator IEnumerable.GetEnumerator()        {            return Clone().GetEnumerator();        }        public void Add(T item)        {            lock(lockObject)            {                innerList.Add(item);            }        }        public void Remove(T item)        {            lock(lockObject)            {                innerList.Remove(item);            }        }        public int Count        {            get            {                lock(lockObject)                {                    return innerList.Count;                }            }        }        public T this[int index]        {            get            {                lock(lockObject)                {                    return innerList[index];                }            }            set            {                lock(lockObject)                {                    innerList[index] = value;                }            }        }        private List<T> Clone()        {            var cloneList = new List<T>();            lock(lockObject)            {                foreach (var item in innerList)                {                    cloneList.Add(item);                }            }            return cloneList;        }    }

  代碼對Add,Remove,Count和索引四個操作加了lock,同時在枚舉時通過加lock并返回當前集合的副本,來避免遍歷時因為其他線程的修改而拋出異常。

  如果代碼需要List類型的全部方法,就需要進一步修改,把IEnumerable改成IList并實現接口,就可以得到一個完整的“data thread safe list”。

  完整的代碼及測試用的程序:代碼


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国产成人在线| 91精品国产自产在线观看永久| 亚洲综合在线中文字幕| 国产在线精品一区免费香蕉| 亚洲国内精品视频| 国产精品v片在线观看不卡| 久久精品国产电影| 精品久久久视频| 91成人在线视频| 性色av一区二区三区红粉影视| 97视频在线观看播放| 亚洲欧美中文日韩v在线观看| 亚洲欧美国产精品va在线观看| 精品色蜜蜜精品视频在线观看| 亚洲偷熟乱区亚洲香蕉av| 中文字幕欧美日韩精品| 午夜精品久久久久久久99热浪潮| 亚洲色图50p| 亚洲成人网av| 国产精品一久久香蕉国产线看观看| 亚洲精品小视频| 午夜精品国产精品大乳美女| 韩国精品美女www爽爽爽视频| 亚洲综合色av| 欧美综合激情网| 国语自产精品视频在免费| 国产亚洲欧美日韩精品| 亚洲片av在线| 久久久综合免费视频| 亚洲国产天堂久久综合网| 久久99精品久久久久久噜噜| 欧美成人精品在线视频| 亚洲精品永久免费精品| 日韩二区三区在线| 夜夜狂射影院欧美极品| 69国产精品成人在线播放| 欧美国产在线视频| 欧美激情xxxx性bbbb| 久久久久久久久国产精品| 午夜精品www| 91性高湖久久久久久久久_久久99| 神马久久久久久| 久久精品2019中文字幕| 久久久免费观看| 成人激情视频在线| 成人免费观看a| 欧美日韩中文字幕日韩欧美| 欧美乱妇高清无乱码| 亚洲国产欧美在线成人app| 国产91网红主播在线观看| 成人黄色在线免费| 欧美专区福利在线| 国产成人久久精品| 亚洲码在线观看| 国产精品一区二区久久精品| 国产精品永久免费观看| 国产精品午夜国产小视频| 欧美午夜片在线免费观看| 亚洲性线免费观看视频成熟| 国产欧美日韩精品在线观看| 国产日韩欧美日韩大片| 精品欧美激情精品一区| 亚洲精品一区在线观看香蕉| 亚洲四色影视在线观看| 黑人巨大精品欧美一区二区免费| 中文字幕日韩视频| 麻豆乱码国产一区二区三区| 亚洲免费电影在线观看| 欧美激情视频在线免费观看 欧美视频免费一| 91免费的视频在线播放| 国产精品视频公开费视频| 国产成人av在线播放| 日韩电影网在线| 国语自产在线不卡| 日韩在线观看网站| 亚洲精品第一页| 日韩美女在线播放| 欧美精品第一页在线播放| 三级精品视频久久久久| 国产成人精品视频在线观看| 一个色综合导航| 亚洲精品日韩在线| 欧美有码在线视频| 精品久久香蕉国产线看观看亚洲| 欧美做受高潮电影o| 欧美亚洲午夜视频在线观看| 97色在线观看| 久久久久久97| 国产999精品久久久影片官网| 精品国产一区二区三区久久久狼| 久久久人成影片一区二区三区| 九九热最新视频//这里只有精品| 亚洲精品电影在线观看| 欧美另类老肥妇| 国产欧美在线看| 国产成人97精品免费看片| 这里只有精品久久| 国产精品久久9| 久久久久久尹人网香蕉| 成人免费网站在线看| 97视频在线免费观看| 国产日韩欧美中文| 国产日韩欧美在线视频观看| 日韩在线免费观看视频| 国产成人在线播放| 国产视频一区在线| 久久久久五月天| 国产经典一区二区| 亚洲日本中文字幕免费在线不卡| 亚洲va欧美va国产综合剧情| 91精品视频免费看| 亚洲国产精品成人精品| 国产精品老女人视频| 九九热这里只有在线精品视| 欧美性猛交xxxx黑人猛交| 久久人人爽亚洲精品天堂| 日韩成人av在线| 孩xxxx性bbbb欧美| 成人黄色在线免费| 久久久久久久97| 色综合导航网站| 亚洲第一精品自拍| 久久久久九九九九| 中文字幕av日韩| 福利二区91精品bt7086| 欧美在线视频一区二区| 韩剧1988在线观看免费完整版| 国产99在线|中文| 欧美裸身视频免费观看| 最近2019中文免费高清视频观看www99| 亚洲视频一区二区三区| 91中文在线视频| 日韩中文字幕精品| 亚洲最新在线视频| 亚洲国产高清福利视频| 亚洲综合精品伊人久久| 91精品国产乱码久久久久久蜜臀| 日韩精品视频三区| 欧美性生交xxxxx久久久| 中文字幕av一区中文字幕天堂| 蜜臀久久99精品久久久无需会员| 78m国产成人精品视频| 日韩av电影中文字幕| 国产精品99久久久久久久久| 欧美精品免费播放| 欧美猛男性生活免费| 亚洲精品久久久久久久久久久久久| 国内精久久久久久久久久人| 亚洲国内高清视频| 日韩av中文字幕在线| 欧美激情国产日韩精品一区18| 国产精品91在线观看| 热久久免费视频精品| 精品欧美激情精品一区| 福利精品视频在线| 久久成人精品视频| 国产日韩综合一区二区性色av| 日韩精品中文字幕有码专区| 国产精品视频26uuu| 亚洲天堂av在线免费| 在线日韩第一页| 亚洲天堂男人的天堂| 国产美女高潮久久白浆| 久久视频中文字幕|