W moim obecnym projekcie istnieje klasa postaci, która wygląda następująco:Rozwiązywanie problemów "Nie można uzyskać dostępu do usuniętego obiektu." Wyjątkiem
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)));
}
}
}
Jak widać używam obiektu System.Timers.Timer. Wiem, że mógłbym użyć System.Windows.Forms.Timer, ale jestem dość zainteresowany tym, dlaczego wciąż otrzymuję wyjątek pokazany w tytule. Jest rzucany na wywołanie Invoke w metodzie UpdateDistanceLabel. Co mnie myli, jest to, że mówi "Nie mogę uzyskać dostępu do unieszkodliwionego obiektu: FormMain", mimo że sprawdzam, czy jest on unieszkodliwiony, czy nie. Tak więc nie powinno się zdarzyć. Próbowałem także pozbyć się obiektu timera w zdarzeniu FormClosing, a także nadpisać Dispose (bool) i usunąć go tam, z których oba niestety nie pomogły. Ponadto, wyjątek nie zawsze jest rzucany, podobno tylko wtedy, gdy czas się uruchamia, gdy program się kończy. Nadal wiele się dzieje.
Widziałem, że istnieje mnóstwo wątków na ten temat, ale już próbowałem rozwiązania zamieszczone tam, większość z nich polega na sprawdzeniu właściwości IsDisposed - która nie działa dla mnie. Sądzę, że robię coś złego.
Moje pytanie: Dlaczego powyższy kod wywołuje wyjątek, mimo że sprawdzam, czy obiekty, do których mam dostęp, są usuwane, czy nie?
Dzięki. Tak właśnie zrobiłem, ale nie wpłynęło to bardzo na zachowanie. – haiyyu