今天在開發中遇到了這樣一個問題
簡單來說,就是有一個接口,用戶會進行一些操作把數據傳到方法內。在方法內我會先吧服務器中的數據通過Id全部拿出來,然後通過循環一一匹配,把數據添加到另外一片內存中。最後,我想要把新添加的數據覆蓋用戶操作的數據,奇蹟的事情發生了。。。
大家可以看到監視器中,list數據爲count1
Data1的數據爲0
在上面的代碼中,我將data1的數據直接給了list
發現沒有?
List的數據沒有變哎,why?????
下面上代碼,首先是我的Model
1 public class AModel 2 { 3 public int AId { get; set; } 4 public List<BModel> BModels { get; set; } 5 } 6 7 public class BModel 8 { 9 public int BId { get; set; } 10 public int BStatus { get; set; } 11 }
接着是我的邏輯塊
1 public async static void TestTest(List<AModel> list) 2 { 3 var data1 = new List<AModel>(); 4 var model1 = new List<BModel>() 5 { 6 new BModel() 7 { 8 BId = 1, 9 BStatus = 2 10 } 11 }; 12 for (int i = 0; i < list.Count; i++) 13 { 14 var data2 = list[i].BModels; 15 for (int j = 0; j < data2.Count; j++) 16 { 17 var serviceData = model1.FirstOrDefault(c => c.BId == list[i].BModels[j].BId); 18 var bStatus = list[i].BModels[j].BStatus; 19 } 20 } 21 list = data1; 22 }
調用方法
1 var aModel = new List<AModel>() 2 { 3 new AModel() 4 { 5 AId = -1, 6 BModels = new List<BModel>() 7 { 8 new BModel() 9 { 10 BId = -2 11 }, 12 new BModel() 13 { 14 BId = -3 15 } 16 } 17 } 18 }; 19 TestTest(aModel);
實在百思不得其解的我,只能一步步的使用排除法來嘗試
會不會是因爲我在查詢條件裏使用了傳輸數據呢?
var serviceData = model1.FirstOrDefault(c => c.BId == list[i].BModels[j].BId);
我把這行代碼進行了分解
1 var bid = list[i].BModels[j].BId; 2 var serviceData = model1.FirstOrDefault(c => c.BId == bid);
然後再來試一下
Ok了。。。
可是。。。
Why???
難道是因爲不使用變量,某些內存不會進行釋放?
還是。。緩存?
只有開闢出一片新的空間,供別處調用,纔不會影響原有數據?
各種各樣的方法在我的腦中打轉
忽然一個念頭衝進了我的腦中,難道是因爲async?畢竟這個是4.5之後才封裝出來的東西
可是,這個也不應該啊,就算是async,也不應該會影響賦值操作吧?引用類型?
先試試再說,把代碼復原,刪掉async
果然如此。
那麼,我是不是可以理解爲,當使用異步時,
var serviceData = model1.FirstOrDefault(c => c.BId == list[i].BModels[j].BId);
list[i].BModels[j].Bid 並沒有被釋放掉,所以導致無法賦值?或許代碼還在線程中的某個地方拼命的跑着
當我使用一個變量去接收時,
var bid = list[i].BModels[j].BId;
相當於開放了一部分空間供list[i].BModels[j].Bid 來使用,所以,即使我再方法結束後,再重新給原數據賦值,因爲沒有用到bid這份空間,所以也就沒了牽連?
以上全是小弟自己研究,如果有不對的地方,希望各位大神能指出來。
雖然困擾我的問題已解決,但是卻不知道理解的對不對。。