Problemas que resolvem “Não é possível acessar o objeto descartado.” Exceção
No meu projeto atual, há uma classe Form que se parece com isso:
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)));
}
}
}
Como você pode ver, estou usando um objeto System.Timers.Timer. Sei que poderia usar System.Windows.Forms.Timer, mas estou bastante interessado no motivo pelo qual ainda estou recebendo a exceção mostrada no título. Ele é lançado na chamada Invoke no método UpdateDistanceLabel. O que me confunde é que ele diz "Não é possível acessar o objeto descartado: FormMain", mesmo que eu esteja verificando se está descartado ou não. Então isso não deveria acontecer. Também tentei descartar o objeto timer no evento FormClosing, bem como substituir Dispose (bool) e descartá-lo lá, os quais infelizmente não ajudaram em nada. Além disso, a exceção nem sempre é lançada, supostamente apenas quando o timer é acionado enquanto o programa está saindo. Ainda acontece muito.
Vi que existem toneladas de threads sobre isso, mas já tentei as soluções postadas lá, a maioria delas envolve a verificação da propriedade IsDisposed - o que não funciona para mim. Acho que estou fazendo algo errad
Então, minha pergunta: por que o código postado acima dispara uma exceção, mesmo que eu esteja verificando se os objetos que estou acessando estão descartados ou nã