登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

秒大刀 博客

好好学习 天天向上

 
 
 

日志

 
 
 
 

Object reference not set to an instance of an object  

2007-11-02 20:41:16|  分类: C# |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

        这个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

 

  评论这张
 
阅读(3499)| 评论(2)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018