您好,登錄后才能下訂單哦!
一、問題來源
1.1問題現(xiàn)象
動態(tài)多字段導(dǎo)出內(nèi)存溢出
1.2問題分析
從問題的現(xiàn)象中找不到問題出現(xiàn)根源,需要通過捕獲異常來分析問題具體出在那
通過不同參數(shù)導(dǎo)出測試,發(fā)現(xiàn)30個以內(nèi)的列名導(dǎo)出沒有問題,超過其上限在datatable給控鍵(原來用aspose控件)賦值中就拋出了異常。當(dāng)初以為是控件問題,就嘗試用NOPI控件,但是問題依然存在。由此可見內(nèi)存溢出很大原因是來自要到導(dǎo)出的列名太多(73個字段),讀取datatable的值時導(dǎo)致了內(nèi)存溢出,需要用另一種方式來替換通過讀取datatable賦值的方式來實(shí)現(xiàn)給導(dǎo)出控件賦值。
二、解決方法
找到了導(dǎo)致問題出現(xiàn)的最大可能,接下來就是如何去解決。如果每次都是全部導(dǎo)出,這個問題好解決,直接通過foreach逐行讀取對象集合給控件賦值就ok了,問題是需要按照客戶選定的列名動態(tài)導(dǎo)出,找出需要導(dǎo)出的字段與其對象屬性的對應(yīng)關(guān)系是解決問題的關(guān)鍵所在。當(dāng)時嘗試用了通過xml配置文件找到它們對應(yīng)關(guān)系,但并未能實(shí)現(xiàn),原因是動態(tài)控制難實(shí)現(xiàn)。有時候思路錯了,思考的方向錯了,問題會越陷越深,出現(xiàn)無頭緒的狀態(tài)。在這個時候我們應(yīng)該跳出來,重新去審視這個問題,用另一種方法去解決。通過重新審視問題,發(fā)現(xiàn)要建立關(guān)系,表頭必須是要存放在二維的表中,只要建立一張基礎(chǔ)關(guān)系數(shù)據(jù)表,用來對象給導(dǎo)出控件賦值遍歷識別是否是用戶選中的列名。這基礎(chǔ)數(shù)據(jù)表要求數(shù)據(jù)全即涵蓋全部的導(dǎo)出字段,且每個字段需有一個對應(yīng)的固定的標(biāo)記空間用來標(biāo)記用戶是否選中這個字段。動態(tài)表頭存放在datatable中,沒有處理的表頭數(shù)據(jù)與基礎(chǔ)關(guān)系表的表頭一致,再通過轉(zhuǎn)過來列名進(jìn)行篩選,保證數(shù)據(jù)的一致性。在此之前需要給這73個列名固定的順序(按照客戶需求的排序)。從而得出解決方案,如下圖
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。