我有一个带有两个变量的简单类和一个从OnTimerTick调用的Close函数。在极少数情况下,在Close()函数中发生NullReferenceException,但我无法理解这些情况可能是什么。有人可以解释一下吗?
System.Windows.Forms.Timer timer = new Timer();
//timer.Tick is wired up in Constructor to OnTimerTick
private void OnTimerTick(object sender, EventArgs e)
{
timer.Tick -= OnTimerTick;
Close();
}
private void Close()
{
if (varOne != null)
{
varOne.SomeEvent -= onSomeEvent;
varOne.Dispose();
varOne = null;
}
if (varTwo != null)
{
varTwo.AnotherEvent -= onAnotherEvent;
varTwo.Dispose();
varTwo = null;
}
}
答案 0 :(得分:1)
假设没有其他线程正在改变你的变量,并假设onSomeEvent
和onAnotherEvent
在当前实例上(即那里没有空引用的机会),那么最可能的事情是那Dispose()
正在投掷?
这是可能的 - 通常在处于错误状态时(实际上,它会困扰WCF);尝试包装处理。
哦;我还假设varTwo
有简单的事件处理程序;对于取消订阅失败的事件,完全可能;例如,如果它正在使用EventHandlerList
并已将其抛弃......
将这些放在一起,如:
// very paranoid cleanup
try {varOne.SomeEvent -= onSomeEvent; }
catch (Exception ex) { Trace.WriteLine(ex); } // best endeavours...
try { varOne.Dispose(); }
catch (Exception ex) { Trace.WriteLine(ex); } // best endeavours...
通常这种偏执是不必要的;但有时它是。