用于读取数据的多线程程序中的空引用异常

时间:2015-02-21 10:38:47

标签: c# multithreading

在我的C#win表单项目中,我通过Web服务读取了一些数据。这需要一些时间,所以我有一个阅读线程:

System.Threading.ThreadPool.QueueUserWorkItem((o) =>
{
    SMSCenter_RecievedMessages = (new SMSCenterGetMessages()).getMessages());

    this.BeginInvoke(new Action(() =>
    {
        if (SMSCenter_RecievedMessages != null && SMSCenter_RecievedMessages.Length != 0)
        {
            // some code
        }
    }));
});

运行2天后,有一段时间我得到了这个例外:

Null Reference Exception was unhandled : Object Reference Not set to an instance of an object.

在创建新对象之前,是否有可能确定getMessage()函数?因为我是通过线程做到的。这段代码出了什么问题?

感谢您的帮助?

1 个答案:

答案 0 :(得分:2)

错误的一个可能原因是SMSCenter_RecievedMessages可能被声明为类字段。如果您的代码段可以连续多次执行(例如,来自点击事件处理程序),那么这可能会导致竞争条件。

假设事件处理程序导致您的代码段开始执行。后台线程使用非null值填充SMSCenter_RecievedMessages,并将控制权分派给UI线程。 UI线程评估SMSCenter_RecievedMessages != nulltrue

与此同时,另一个事件处理程序导致您的代码段再次开始执行(并发)。这一次,getMessages()返回null;这将分配给相同的SMSCenter_RecievedMessages字段并覆盖之前的值。

与此同时,UI线程继续执行,并尝试评估SMSCenter_RecievedMessages.Length != 0。由于该字段现已设置为null,因此会出现NullReferenceException