В моем текущем проекте есть класс Form, который выглядит так:
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, но меня довольно интересует причина, по которой я все еще получаю исключение, указанное в названии. Он получает вызов Invoke в методе UpdateDistanceLabel. Меня смущает то, что в нем говорится: "Не удается получить доступ к удаленному объекту: FormMain", даже если я проверяю, выбрано оно или нет. Так что этого не должно быть. Я также попытался удалить объект таймера в событии FormClosing, а также переопределить Dispose (bool) и удалить его там, оба из которых, к сожалению, вообще не помогли. Кроме того, исключение не всегда получается брошенным, предположительно, только когда таймер срабатывает, пока программа выходит. Это все еще случается много.
Я видел, что в этом есть много потоков, но я уже пробовал решения, размещенные там, большинство из которых связано с проверкой свойства IsDisposed - что не работает для меня. Поэтому я думаю, что я делаю что-то неправильно.
Итак, мой вопрос: Почему вышеописанный код запускает исключение, хотя я проверяю, находятся ли объекты, к которым я обращаюсь, или нет?