客户端有个线程循环接收消息,这时客户端发送特定消息。如:发送退出消息,并且希望服务器端返回退出成功的消息。
开始是这样处理的,发送退出消息后就接收,但是客户端就死在哪儿了,查明原因发现socket是不允许同时多个方法去接收消息的,那样的话就会产生死锁。
第二种方法:我尝试先abort那个循环接收消息线程,还是失败,因为abort线程是需要一定时间的,而且TerminateThread有很多问题,所以也就没试过。
第三种方法:那就是在循环接收消息里进行处理,对消息类型进行判断,如果接收的是退出消息类型,然后出发事件来处理退出消息。测试成功。不知道还有其它什么方法没?比如异步操作?那位兄台告知,谢谢。

解决方案 »

  1.   

    wzd24(牧野),你看需不需要建议他用Socket的异步操作?估计他那个循环接收消息就是简单地抛到另外一个线程上了.
      

  2.   

    回复人:RedGoldFish(红金鱼) ( 二级(初级)) 信誉:100  2007-06-13 16:53:44  得分:0

    wzd24(牧野),你看需不需要建议他用Socket的异步操作?估计他那个循环接收消息就是简单地抛到另外一个线程上了.
    ----------------------------------
    客户端就不要去用异步了!太麻烦,而且又没有什么性能提升!他这个方案在客户端是很好的!
      

  3.   

    异步开发是恶魔!
    对于一个Socket,有一个线程发送、一个线程接收,这是很合理的。
    恭喜你已经自己找到最佳答案了。
      

  4.   

    说到客户端,也就是说假设他只有一个Socket接收消息,好歹用线程也就是一个,不做异步也罢. 至于性能,多个Socket接收不用说,异步肯定是好的,省了线程.如果只有一个Socket接收,我还真没比较过,也许差不太多.
      

  5.   

    weihthchk(Spectrum)异步开发是恶魔!
    _______________________你的意思是说异步调用的开发繁琐,不容易理解还是说.NET这种异步调用的设计不好?
      

  6.   

    回复人:RedGoldFish(红金鱼) ( 二级(初级)) 信誉:100  2007-06-13 17:24:12  得分:0

    说到客户端,也就是说假设他只有一个Socket接收消息,好歹用线程也就是一个,不做异步也罢.至于性能,多个Socket接收不用说,异步肯定是好的,省了线程.如果只有一个Socket接收,我还真没比较过,也许差不太多.
    ----------------------------
    服务端也不一定要用异步,有些情况下同步会更好一点!
      

  7.   

    这个东西的关键不在客户端或服务端,关键是看你有多少个Socket在同时接受.如果几个或十几个问题不是很大.我做的一些东西经常要有几百个Socket同时接收,如果起几百个线程去接收,系统的主要资源就全在维护线程了,性能不会好.我们有个类似的程序,结果是推倒重新写.
      

  8.   

    回复人:RedGoldFish(红金鱼) ( 二级(初级)) 信誉:100  2007-06-13 18:05:49  得分:0

    这个东西的关键不在客户端或服务端,关键是看你有多少个Socket在同时接受.如果几个或十几个问题不是很大.我做的一些东西经常要有几百个Socket同时接收,如果起几百个线程去接收,系统的主要资源就全在维护线程了,性能不会好.我们有个类似的程序,结果是推倒重新写.
    ---------------------------------
    几百个Socket???这当然要用异步,但楼主他只有一个Socket!
      

  9.   

    对,我那些程序就是对付几百个Socket,所以用异步. LZ就一个Socket,无所谓的, 我上边不也说了嘛:  不做异步也罢.