C#未将对象引用设置到对象的实例
/// <summary>/// 处理接收的数据
/// </summary>
/// <param name="bs"></param>
private void HandleRecvQueue()
{
try
{
while (m_Socket.Connected)
{
getRecvQueue();
for (int i = 0; i < m_RecvWaitQueue.Count; i++)
{
structRecvQueue recvQueue = (structRecvQueue)m_RecvWaitQueue.GetByIndex(i);
byte[] bs = recvQueue.bs;
int index = 0;
while (index < bs.Length)
{
if (flag)
{
m_uMsgLength = clsBitConvert.Bytes2Uint(bs, (int)index);
recv_Index = 0;
buf = new byte[m_uMsgLength];
for (int j = 0; j < m_uMsgLength; j++)
{
if (index < bs.Length)
{
buf[j] = bs[index];
recv_Index++;
index++;
}
else
{
flag = false;
break;
}
}
}
else
{
int temp = (int)m_uMsgLength - recv_Index;
for (int ii = 0; ii < temp; ii++)
{
if (index < bs.Length)
{
buf[recv_Index] = bs[ii];
recv_Index++;
index++;
}
else
{
flag = false;
break;
}
}
}
//判断是否相等
if (recv_Index == m_uMsgLength)
{
flag = true;
}
else
{
flag = false;
}
//if (m_uMsgLength <= bs.Length)
{
if (!flag)
{
break;
}
else
{
clsHeader header = new clsHeader(buf);
string msg = "";
if (m_uMsgLength == header.MSGLength)
{
switch (header.Command_Id)
{
case (uint)CMPP_Command_Id.CMPP_CONNECT://请求连接
msg = "mo收到 Connect";
Console.WriteLine(msg);
Login();
break;
case (uint)CMPP_Command_Id.CMPP_CONNECT_RESP://请求连接应答
msg = "mo收到 Connect Resp";
Console.WriteLine(msg);
clsCmppConnectResp m_CmppConnectResp = new clsCmppConnectResp(buf);
if (m_CmppConnectResp.Result == 0)
{
isLogin = true;
}
else
{
isLogin = false;
}
break;
case (uint)CMPP_Command_Id.CMPP_TERMINATE://终止连接
msg = "mo收到 Terminate";
Console.WriteLine(msg);
uint seq = getNextSequence();
clsCmppTerminateResp m_CmppTerminateResp = new clsCmppTerminateResp(seq);
clsMsgQueueItem q = new clsMsgQueueItem(seq, CMPP_Command_Id.CMPP_TERMINATE_RESP);
q.MsgObj = m_CmppTerminateResp;
AddWaitQueueItem(q);
break;
case (uint)CMPP_Command_Id.CMPP_TERMINATE_RESP://终止连接应答
msg = "mo收到 Terminate Resp,与网关断开连接";
Console.WriteLine(msg);
CloseSocket();
if (onCloseWindowEvent != null && EXIT_FLAG)
{
onCloseWindowEvent();
}
break;
case (uint)CMPP_Command_Id.CMPP_SUBMIT_RESP://提交短信应答
msg = "mo收到 Submit Resp";
Console.WriteLine(msg);
clsCmppSubmitResp m_SubmitResp = new clsCmppSubmitResp(buf);
HandleRecvSubmitResp(m_SubmitResp);
break;
case (uint)CMPP_Command_Id.CMPP_DELIVER://短信下发
HandleDeliverData(buf);
msg = "mo收到 Deliver";
Console.WriteLine(msg);
AddRECV();
break;
case (uint)CMPP_Command_Id.CMPP_ACTIVE_TEST://激活测试
msg = "mo收到 Ping";
Console.WriteLine(msg);
clsCmppActiveTestResp m_CmppActiveTestResp = new clsCmppActiveTestResp(clsBitConvert.Bytes2Uint(buf));
sendData(m_CmppActiveTestResp.toByte());
break;
case (uint)CMPP_Command_Id.CMPP_ACTIVE_TEST_RESP://激活测试应答
msg = "mo收到 Ping Resp";
Console.WriteLine(msg);
SubSendActuveTestNum();
break;
default:
msg = "mo未知消息";
Console.WriteLine(msg);
break;
}
}
}
}
}
RemoveRecvQueue(recvQueue);
}
Thread.Sleep(10);
}
}
catch (SocketException ex)
{
clsBitConvert.DebugBytes("HandleRecvQueue : " + ex.Message, "RecvDataerr.txt");
}
catch (Exception ex)
{
clsBitConvert.DebugBytes("HandleRecvQueue : " + ex.Message, "molog.txt");
Thread.Sleep(100);
CloseSocket();
myclose();
}
}
private void myclose()
{
System.Diagnostics.Process [] myProcess;
myProcess = System.Diagnostics.Process.GetProcessesByName("smsrun.exe");
foreach (System.Diagnostics.Process instance in myProcess)
{
string pro = instance.ToString();
pro = pro.Replace("System.Diagnostics.Process (", "");
pro = pro.Replace(")", "");
instance.WaitForExit(100);
instance.CloseMainWindow();
}
}
为什么会出现(HandleRecvQueue: 未将对象引用设置到对象的实例)这个错误,请高手指点一下
并且myclose()也不会被执行 --------------------编程问答-------------------- 程序太长了,
肯定是哪里的值为null了.lz在你的方法里设个断点自己调试一下.
遇到问题要先尝试自己解决,最起码要知道问题出在具体的哪一行. --------------------编程问答-------------------- 设置断点跟踪下,应该是一个对象为null,但是你还在访问他的成员,导致出现这错误 --------------------编程问答-------------------- 楼主:应该是连接断开了。
或是连接对象没有在连接前实例化。 --------------------编程问答-------------------- 单步调试,哪里报错就知道了 --------------------编程问答-------------------- 单步调试很容易找到原因的。可以试试看。 --------------------编程问答-------------------- 在你的HandleRecvQueue方法的catch (Exception ex)这行设置一个断点,然后按F5运行你的程序,待到执行到这个断点时,将鼠标光标放在ex上,将其展开,可以根据StackTrace的信息判断是哪行出了问题,然后再仔细检查那一行,看是否有对象定义了但是没有被new出来。
--------------------编程问答-------------------- 楼上可用!~
补充:.NET技术 , C#