空間被佔用會導致無法操作裏面的數據?

今天在開發中遇到了這樣一個問題

簡單來說,就是有一個接口,用戶會進行一些操作把數據傳到方法內。在方法內我會先吧服務器中的數據通過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這份空間,所以也就沒了牽連?

以上全是小弟自己研究,如果有不對的地方,希望各位大神能指出來。

雖然困擾我的問題已解決,但是卻不知道理解的對不對。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章