分享我在任務中碰到的多線程下招致RCW沒法釋放的成績。本站提示廣大學習愛好者:(分享我在任務中碰到的多線程下招致RCW沒法釋放的成績)文章只能為提供參考,不一定能成為您想要的結果。以下是分享我在任務中碰到的多線程下招致RCW沒法釋放的成績正文
比來有個同事在挪用一個類庫中的辦法時碰到了一個成績,異常信息以下:
測驗考試釋放正在應用的RCW,運動線程或其他線程上正在應用該 RCW,釋放正在應用的 RCW 的測驗考試會招致破壞或數據喪失。
該辦法中對word文件停止相干了操作,由於我之前也在多線程情況下挪用過該辦法,而且沒碰到這個成績,所以同事讓我曩昔看看怎樣回事。這個辦法在對文件停止相干操作後,會挪用別的一個辦法釋放word對象,部門代碼以下:
Word._Application t = oWord as Word._Application; object oIsSave = false; t.Quit(ref oIsSave, ref oMissing, ref oMissing); System.Runtime.InteropServices.Marshal.ReleaseComObject(oDoc); System.Runtime.InteropServices.Marshal.ReleaseComObject(oWord); oWord = null; oDoc = null; GC.Collect(); GC.Collect();
該段代碼是為了包管立刻釋放word對象並封閉word過程。由於異常信息定位在這裡,所以我曩昔後就從這裡開端看,然則看了半天,也沒看出類庫中的辦法有甚麼成績,由於之前我應用的時刻沒碰到這類情形,是以我認為能夠不會是這裡的成績,而且我擔任的誰人產物曾經經由了年夜量的測試,確定是沒成績的,所以我說讓我看看你是怎樣挪用的吧,翻開他的代碼看了一眼,全體上沒甚麼其他成績,然則有個處所惹起了我的留意,代碼中對該類的實例化放在了全局規模,由於是個cs項目,這麼做會招致該對象一直被援用,是以即便在渣滓收受接管時也沒法被釋放,而這裡挪用的又是com組件,就招致了word過程沒法封閉,而且同事在這裡用的是多線程,所以法式一運轉起來,會湧現一年夜堆word過程關不失落。因而就將這裡的對象實例化放到了線程辦法中,如許在辦法履行停止後,堆中的對象就處於無援用狀況,在渣滓收受接管時就被釋放了,成績就天然處理了。其實這裡跟單線程照樣多線程沒緊要,重要是在全局規模內停止實例化招致了對象不克不及被渣滓收受接管,所以在寫代碼的時刻必定要留意對象的性命周期。