国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

小記:目標數組的長度不夠。請檢查 destIndex 和長度以及數組的下限。

2019-11-17 02:16:19
字體:
來源:轉載
供稿:網友

小記:目標數組的長度不夠。請檢查 destIndex 和長度以及數組的下限。

異常:System.ArgumentException:目標數組的長度不夠。請檢查destIndex和長度以及數組的下限。(不好意思忘記截圖了)

發生異常的代碼如下:

var list = new List<Topic>();Parallel.For(2, totalPage + 1, page =>{    //AddRange 方法發生異常    list.AddRange(GetTopics(board.BoardID, page));});

原因:List<T> 集合不是線程安全的,在并發操作 List 時,內部計算可能會出現問題。(具體內部會出現什么問題,我這個菜鳥在這里就不賣弄了,大家可以反編譯看看 List 內部實現原理)

經過在StackOverflow上查找得知2種解決方法:以下為原回答截圖

地址:http://stackoverflow.com/questions/8796506/correct-way-to-guarantee-thread-safety-when-adding-to-a-list-using-parallel-libr

即:第一種,使用 lock 加鎖

PRivate static readonly object locker = new object();Parallel.For(2, totalPage + 1, page =>{    var range = GetTopics(board.BoardID, page);    lock(locker)    {        list.AddRange(range);    }});

第二種,使用 asparallel().SelectMany 并發生成一個 Enumerable

//生成一個整數序列var nums = Enumerable.Range(2, totalPage - 1);//使用 AsParallel 執行并發操作,并使用 SelectMany 將每個元素映射為新的對象,然后將結果合并為一個集合var range = nums.AsParallel().SelectMany(page => GetTopics(board.BoardID, page));//同步增加到 List 中list.AddRange(range);

經過在MSDN上查找,發現有一個命名空間下實現了一些線程安全集合類,如下圖

地址:https://msdn.microsoft.com/zh-cn/library/system.collections.concurrent(v=vs.100).aspx

上面這些線程安全集合類我暫時沒有用過,不過既然是微軟提供的,想必性能各方面都應該不錯,大家可根據適用場景自行選擇。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 潢川县| 台州市| 区。| 玉溪市| 德钦县| 咸宁市| 怀化市| 进贤县| 阿瓦提县| 江陵县| 宝兴县| 双流县| 营山县| 休宁县| 张家口市| 景谷| 明溪县| 都兰县| 塘沽区| 宣恩县| 霸州市| 东台市| 盈江县| 麦盖提县| 凉城县| 阜南县| 兴仁县| 蒲城县| 巨野县| 涞源县| 宣威市| 五莲县| 颍上县| 孟津县| 鄂温| 遂宁市| 木里| 梨树县| 常德市| 旬邑县| 临潭县|