我有一個內部管理IBuffer的類。數據是敏感的,所以我想讓這個類確保緩衝區在被銷燬之前被清空,以避免將這些位留在內存中。我有一個擦除()方法,該方法如下:在析構函數中刪除IBuffers
public static void Erase(this IBuffer value)
{
using (var writer = new DataWriter(value.AsStream().AsOutputStream()))
{
for (int i = 0; i < value.Length; i++)
writer.WriteByte(0);
var storeTask = Task.Run(async() => await writer.StoreAsync());
storeTask.Wait();
}
}
首先,我承認,我的使用Task.Run這裏來調用非CPU綁定的異步方法是犯罪嫌疑人,但我還沒有找到一個同步等價物。替代品是受歡迎的。
我遇到的問題是,在調試模式下,大多數時候在發佈模式下,它運行完美。然而,偶爾在發佈模式,我碰到一個異常時,最後確定()是我的對象上運行:
型「System.Runtime.InteropServices.InvalidComObjectException」未處理的異常發生在System.Runtime.WindowsRuntime。 dll
附加信息:Excep_InvalidComObject_NoRCW_Wrapper。欲瞭解更多信息,請訪問:http://go.microsoft.com/fwlink/?LinkId=623485
的URL真的只對優化爲淨本土的,不是這個特定的異常類型的異常會談。
我推測原因可能與IBuffer在我的Erase方法有機會完成之前被銷燬有關。
我該如何正確實現我想要的行爲?
使用'IDisposable',而不是終結器。 – SLaks
但是不要求類的用戶明確調用Dispose?這不是我想要的行爲。並且IDisposable的文檔說「如果消費者忘記調用Dispose,您應該重寫Object.Finalize以釋放非託管資源。」其中Object.Finalize在C#中通過實現析構函數被重寫。 –
如果你的班級處理不應該留在內存中的祕密,你的調用者需要顯式調用Dispose(通過'using')。 **不要依賴GC來破壞記憶**。 – SLaks