在我目前的项目有一个表单类,它看起来是这样的:解决问题“无法访问处置的对象”。例外
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