C#异步场景下Queue存储字符串数组重复问题排查
问题原因分析
1. 队列全是最后一组数据的原因
string[]是引用类型,你在ReadFromDB3方法的循环外部只创建了一个数组实例:string[] arr = new string[8];。后续每次循环只是修改这个数组里的元素值,然后把这个数组的引用传入dt.WrToBuffer3(arr)加入队列。队列里存储的全是同一个数组的引用,当最后一次循环修改完数组内容后,所有队列元素指向的都是这个被最后一次修改的数组,所以看起来全是最后一组数据。
2. 内存持续扩容的原因
虽然每次加入队列的是同一个数组引用,但Queue会把这个引用作为新元素持续添加,队列的元素数量随着循环次数不断增加,对应的内存也就持续扩容——本质是队列里存了N个指向同一数组的重复引用,而非N个独立的数组实例。
快速修复方案
把数组的创建放到循环内部,每次循环生成新的数组实例:
while (dataReader.Read()) { // 每次循环创建新的数组,避免复用同一引用 string[] arr = new string[8]; arr[0] = dataReader[0].ToString(); arr[1] = dataReader[1].ToString(); arr[2] = dataReader[2].ToString(); arr[3] = dataReader[3].ToString(); arr[4] = dataReader[4].ToString(); arr[5] = dataReader[5].ToString(); arr[6] = dataReader[6].ToString(); arr[7] = dataReader[7].ToString(); dt.WrToBuffer3(arr); Thread.Sleep(10); }
内容的提问来源于stack exchange,提问作者Maher
相关产品推荐
相关产品推荐

