嘗試在類析構函數中運行異步操作失敗。異步操作在析構函數中
這是代碼:
public class Executor
{
public static void Main()
{
var c1 = new Class1();
c1.DoSomething();
}
}
public class Class1
{
public void DoSomething()
{
}
private int _i = 100;
private int _j = 100;
~Class1()
{
Task.Run(() => _j *= 2); //Does not progress _j
_i *= 2; //Progress _i from 100 to 200
Thread.Sleep(1000);
Console.WriteLine("In destructor. _i = " + _i);
Console.WriteLine("In destructor. _j = " + _j);
}
}
,輸出是:
In destructor. _i = 200
In destructor. _j = 100
繼Destructor page on MSDN沒有提及例如破壞線程/異步方面。
那麼有什麼想法?
謝謝
'Task.Run'將啓動另一個線程,但即使您等待1秒也許這是不夠的。您需要等待任務的結果,可能使用'.Wait()'來確保它完成。這就是說我認爲在析構函數中啓動線程或任務是一個壞主意。應該使用析構函數來清理非託管內存。 – Igor
哇,在GC之後將一個引用傳遞給另一個線程的想法顯然已經將該引用放入終結器隊列中了... –
@RenéVogt該文檔明確提到析構函數中的代碼是在完成對象之前執行的。看到這個錨的底部:https://msdn.microsoft.com/en-us/library/66x5fx1b.aspx#Remarks –