Nel mio progetto attuale c'è una classe Form che assomiglia a questo:Problemi di risoluzione "Impossibile accedere all'oggetto disposto". eccezione
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)));
}
}
}
Come potete vedere, sto usando un oggetto System.Timers.Timer. So che potrei usare System.Windows.Forms.Timer, ma sono abbastanza interessato al motivo per cui sto ancora ricevendo l'eccezione mostrata nel titolo. Viene generato alla chiamata Invoke nel metodo UpdateDistanceLabel. Ciò che mi confonde è che dice "Impossibile accedere all'oggetto disposto: FormMain" anche se sto verificando se è disposto o meno. In modo che non dovrebbe accadere. Ho anche provato a smaltire l'oggetto timer nell'evento FormClosing, oltre a ignorare Dispose (bool) ea smaltirlo lì, che purtroppo non sono stati di aiuto. Inoltre, l'eccezione non viene sempre generata, presumibilmente solo quando il timer si accende mentre il programma sta uscendo. Succede ancora molto.
Ho visto che ci sono un sacco di discussioni su questo, ma ho già provato le soluzioni pubblicate lì, la maggior parte di esse riguarda il controllo della proprietà IsDisposed - che non funziona per me. Quindi immagino di fare qualcosa di sbagliato.
Quindi la mia domanda: Perché il codice pubblicato sopra attiva un'eccezione anche se sto verificando se gli oggetti che sto accedendo sono disposti o meno?
Grazie. Questo è quello che ho fatto ora, tuttavia, non ha influenzato molto il comportamento. – haiyyu