場景:
C++部分封裝為COM,C#來調用。調用可能是在線程中的。
應用程序退出時,C#的部分 自動清理,某些線程可能還沒有完全停掉。
COM內部的東西也在釋放內存。
這個時候,稍有不慎,就會崩潰。
沖突點:
1. 多個線程重復ReleaseComObject,
2. C#某個線程還在使用,另外一個線程或者主線程去ReleaseComObject。
3. 已經進行了ReleaseComObject, c#某個線程還在使用。
最讓人郁悶的地方是:
=
這個Try-Catch 是沒用的,出來異常,照樣死掉。
仔細排查,解決辦法如下:
1. 針對多個線程重復ReleaseComObject的問題,確定“誰創建誰Release”的原則,無法確定的,留到App Exit的時候Release。
2. 資源已經Release,還在使用的問題
檢查發現有個線程sleep了100個毫秒,這個趕緊改掉。App exit的時候,100ms可以干好多事情的。
另外, 不知道有沒有好的辦法來判斷COM對象存在與否,能否安全調用。
3. 正在使用的資源,另外一個線程去Release, 遵照第一個原則來執行。
4. 線程內循環的方法,粒度盡量小,便於及時更新UI和快速剎車。
5. 線程工廠,盡可能的簡單明了。復雜的代價是寫的痛苦,維護的痛苦。
嘗試著改了幾個地方,發現還是有問題。失控的多線程遇上了COM,真的難搞。