具体的问题是这样的……我们有一批分散安装的远程抄表设备,这些设备使用gprs网络登陆到一台客户的服务器上,在服务器上运行着的管理这些设备的程序一般称作“主站”。我们作为设备提供商想与这些设备通讯的话,除了跑到设备旁边接笔记本,就只能通过“主站”所提供的webservice接口。具体说就是一个函数,参数是要发给设备的命令、超时时间、是否需要回应,返回值就是设备的回应。这里有两个问题,第一 gprs通讯并不十分稳定,主站也不能时刻了解连接是否通畅,所以主站有时候也是等超时才知道设备通讯不上的;第二 这个webservice工作情况也不太稳定,比如有时使用两台不同的电脑通过webservice向同一设备发指令,其中一台会比较快而在此期间另一台电脑会得不到回应。一般情况下,只是发个命令,看个回复,这个模式还能忍,但现在需要对这些设备发送分包文件进行远程升级……我做的程序思路是每太设备发的一个包,都新起一个线程,线程的内容就是webservice函数,如果有返回值,那么根据返回值的情况进行下一步(比如再开一个线程发下一个包),然后该线程结束。但现在经常发生线程执行了函数,然后在那苦等函数返回值,有时候时间还很长……如果不等它回应,等个30秒再开一个线程发同一个包,有时返回是正常的。业务逻辑可以继续,但那上一个线程还是停在那……有没有办法能让线程 (获得函数返回值) or (建立20秒之后) 两条件满足一个就能结束……?

解决方案 »

  1.   

    如果是web server端太慢就需要优化server端了,如果是网络不行应该转换思路,想想其他办法,比如单独线程专门去处理这些慢的工作。
      

  2.   

    现在搞了个笨办法…每次建立一个发包线程都把地址丢给一个kill线程,30秒之后杀掉发包线程如果他还存在的话…
      

  3.   

    使用curl.exe,它比较强壮、稳定
    独立外部程序方式运行
      

  4.   

    这类应用最好是写SOCKET来实现服务端和客户端,别用WebService,这个处理重传续传太麻烦。
      

  5.   

    强烈附议……但是客户方的主站提供商采用的是java框架实现的bs结构主站。个人估计处理终端通讯的部分直接就是在他们程序内部的接口基础上实现的webservice