这个bug找了好久,我的方法里全是值类型的运算怎么会出现空引用呢?不过经过昨天晚上一整夜(北京时间今天早上)的梦中思考,终于明白的出现这个错误的原因了。
我的系统是基于多线程的CS模型的。网络收发一个线程、网络命令解析和处理一个线程、UI主线程。程序启动的过程中首先要通过验证登陆服务器,当验证成功后服务器就会认为客户端已经完全的登陆了,服务器就会认为客户端可以接收任何合法的消息了。岂知客户端在登陆成功后还需要进行一些其他的初始化工作。在Application.Run(new MyForm())执行之前或者没有执行到一定程度时对UI的访问可以认为是非法的。如果在这个时候恰好有服务器消息到来,经过网络收发→命令解析→命令处理→UI表现时就会出现这个莫名的Object reference not set to an instance of an object异常。因为要表现的UI本身还没有创建。
解决的方法很多。1.可以在客户端去控制一个登陆状态,在没有完全准备好的情况下忽略不必要的网络消息。2.也可以通过CS联合控制,客户端准备好有给服务器发一个Ready消息,这时服务器才将其注册到消息容器。3.最简单的是采用鸵鸟政策,若这些消息时可以忽略的,则对这些异常视而不见,乐哉。
在多线程的程序中不仅仅要注意线程间的同步互斥,还要密切注意时序问题,尤其是在线程的启动和线程结束的时候。
Good bye Object reference not set to an instance of an object
评论