在System.Windows.Forms.Timer tick事件中发生NullReferenceException

时间:2009-07-29 14:22:48

标签: c# .net

我有一个带有两个变量的简单类和一个从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;
    }
}

1 个答案:

答案 0 :(得分:1)

假设没有其他线程正在改变你的变量,并假设onSomeEventonAnotherEvent在当前实例上(即那里没有空引用的机会),那么最可能的事情是那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...

通常这种偏执是不必要的;但有时它是。