我想填補知識空白。我有一個控件調用BeginInvoke(委託),然後控件立即自行處置。爲什麼控件的BeginInvoke()目標委託永遠不會發生在控件上調用Dispose()之後?
委託從未出現過。這似乎是Control.Dispose()的結果。
我的困惑在於(我認爲)BeginInvoke將委託放置到稍後在UI線程上處理的Windows消息隊列中。爲什麼處置這個控制與這個代表不再發射有關?它在處置之前已經放在隊列中。另外,如果它與Windows句柄有關,爲什麼我不會得到一個異常而不是安靜地忽略委託?下面
是我的意思一個簡單的例子:
class myControl : UserControl
{
public myControl()
: base()
{ }
public void DoBeginInvoke()
{
this.BeginInvoke(new MethodInvoker(
() => { Console.WriteLine("!!TESTING 123!!"); }
));
// silently prevents the delegate from occuring..
this.Dispose();
}
}
預先感謝你的解釋。爲簡單問題道歉。
你確信對象沒有之前被調用的方法設置?應該立即執行Dispose調用,而BeginInvoke會在稍後排隊。 –
這是非常有意的,Control.Dispose()通過調用隊列並刪除所有未決的調用。如果不這樣做,那麼程序很可能會以非常難以診斷的方式轟炸ObjectDisposedException。它只是一種創可貼,而不是一個真正的解決方案,它使得您的bug更易於診斷。在UI消失後讓線程繼續調用是一個非常常見的錯誤。 –
謝謝Hans Passant。這個解釋爲我增加了寶貴的額外洞察力。 – n00bCoder