在我的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()
函数?因为我是通过线程做到的。这段代码出了什么问题?
感谢您的帮助?
答案 0 :(得分:2)
错误的一个可能原因是SMSCenter_RecievedMessages
可能被声明为类字段。如果您的代码段可以连续多次执行(例如,来自点击事件处理程序),那么这可能会导致竞争条件。
假设事件处理程序导致您的代码段开始执行。后台线程使用非null值填充SMSCenter_RecievedMessages
,并将控制权分派给UI线程。 UI线程评估SMSCenter_RecievedMessages != null
到true
。
与此同时,另一个事件处理程序导致您的代码段再次开始执行(并发)。这一次,getMessages()
返回null
;这将分配给相同的SMSCenter_RecievedMessages
字段并覆盖之前的值。
与此同时,UI线程继续执行,并尝试评估SMSCenter_RecievedMessages.Length != 0
。由于该字段现已设置为null
,因此会出现NullReferenceException
。