我们发现了异常(不知道为什么Win7 Embedded系统中没有行号):
Exception Message: System.NullReferenceException: Object reference not set to an instance of an object.
在这一行中,我认为:
ThreadPool.QueueUserWorkItem(HandleSaveStatus, (EvDoSaveStatus)systemSwEvent);
我能想到的唯一地方是(EvDoSaveStatus)systemSwEvent
。但我做了类似的测试,如下:
SystemSwEvent ev = new EvDoSaveStatus();
ev = null;
EvDoSaveStatus evt = (EvDoSaveStatus)ev;
string str = "Is it good?";
没有抛出异常。这意味着即使(EvDoSaveStatus)systemSwEvent
systemSwEvent
某种方式null
也会很好{/ 1}}。
如果EvDoSaveStatus
的其中一个成员变为null,则不应在上述ThreadPool
语句中产生异常。我是对的吗?
修改 在这种情况下:
case "EvDoSaveStatus":
{
Log.logItem(LogType.DebugDevelopment, "EvDoSaveStatus", "dsm::publish()", "EvDoSaveStatus received");
ThreadPool.QueueUserWorkItem(HandleSaveStatus, (EvDoSaveStatus)systemSwEvent);
break;
}
我们有可用的日志条目。
EDIT2: 整个发布方法:
public void publish(SystemSwEvent systemSwEvent)
{
try
{
switch (systemSwEvent.eventName)
{
case "EvLogin":
{
break;
}
case "EvLogoff":
{
break;
}
case "...":
break;
case "EvDoSaveStatus":
{
Log.logItem(LogType.DebugDevelopment, "EvDoSaveStatus", "dsm::publish()", "EvDoSaveStatus received");
ThreadPool.QueueUserWorkItem(HandleSaveStatus, (EvDoSaveStatus)systemSwEvent);
break;
}
}
}
catch (Exception ex)
{
Log.logItem(LogType.Error, "Exception in publish()", "dsm::publish()", "Exception:" + ex + "\nStackTrace:" + ex.StackTrace + "\n" + ex.Message);
}
}
答案 0 :(得分:2)
ev = null;
EvDoSaveStatus evt = (EvDoSaveStatus)ev;
将导致evt
为空。您可以将null作为QueueUserWorkItem
的第二个参数传递,但是您排队的回调需要处理它。
HandleSaveStatus
必须是WaitCallback,因此它需要一个对象参数。它试图用这个对象做什么?它是否处理它为null的情况?
public void HandleSaveStatus(object state){
if (state == null)
{
return; // or whatever else you want to do with a null state
}
// Do work with non-null state
}
答案 1 :(得分:2)
疯狂猜测......
根据documentation for QueueUserWorkItem,仅当第一个参数callback
为空时,它才会抛出NullReferenceException。
HandleSaveStatus实际上是一种方法吗?如果它是一个实例方法,你确定在初始化对象之前你没有从基类构造函数中调用这个代码吗?
尝试将线拆分为此并查看错误是否仍在第二行:
WaitCallback callback = new WaitCallback(HandleSaveStatus);
ThreadPool.QueueUserWorkItem(callback, (EvDoSaveStatus)systemSwEvent);
显式构造函数调用(new WaitCallback
)实际上比必要的更冗长,但它表明委托创建是另一个可能的NullReferenceExceptions源。