在我目前的項目有一個表單類,它看起來是這樣的:解決問題「無法訪問處置的對象」。例外
public partial class FormMain : Form
{
System.Timers.Timer timer;
Point previousLocation;
double distance;
public FormMain()
{
InitializeComponent();
distance = 0;
timer = new System.Timers.Timer(50);
timer.AutoReset = true;
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
timer.Start();
}
private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (previousLocation != null)
{
// some code
UpdateDistanceLabel(distance);
UpdateSpeedLabel(v);
}
previousLocation = Cursor.Position;
}
private void UpdateDistanceLabel(double newDistance)
{
if (!lblDistance.IsDisposed && !IsDisposed)
{
Invoke(new Action(() => lblDistance.Text = String.Format("Distance: {0} pixels", newDistance)));
}
}
private void UpdateSpeedLabel(double newSpeed)
{
if (!lblSpeed.IsDisposed && !IsDisposed)
{
Invoke(new Action(() => lblSpeed.Text = String.Format("Speed: {0} pixels per second", newSpeed)));
}
}
}
正如你所看到的,我使用的是System.Timers.Timer對象。我知道我可以使用System.Windows.Forms.Timer,但是我仍然對標題中顯示的異常仍然感興趣。它在UpdateDistanceLabel方法中的Invoke調用中被拋出。令我困惑的是它說「不能訪問處置對象:FormMain」,即使我正在檢查它是否被處置。所以這不應該發生。我也嘗試在FormClosing事件中處理Timer對象,並重寫Dispose(bool)並將其放置在那裏,這兩者都不幸根本沒有任何幫助。此外,異常並不總是被拋出,據推測,只有當計時器在程序退出時觸發時纔會被拋出。它仍然發生很多。
我已經看到有大量的線程關於這個,但我已經嘗試過發佈的解決方案,其中大多數涉及檢查IsDisposed屬性 - 這對我不起作用。所以我想我做錯了什麼。
所以我的問題: 爲什麼上面發佈的代碼觸發異常,即使我正在檢查我正在訪問的對象是否處置?
謝謝。這就是我現在所做的,但是,這並不會影響行爲。 – haiyyu 2012-03-12 14:54:28