求助了好几个贴子,都基本没有正常的可用的回复...需求是这样的:
写一个winform程序,该程序最少会连接到4个不同的服务器上,
(服务器是非常被动的,客户端发送一个命令给服务器,服务器就
按照命令返回一串数据,因为服务器不是电脑服务器,而是PLC)通信的过程是这样的:
我的winform程序使用timer定时向各服务器发送数据请求命令,
然后接收返回的数据,问题是:1.因为同时连接到多个服务器,在socket connect的时候,会发生阻塞,
如果使用多线程,在新的线程里创建这4个socket,并connect
发现在调用函数结束后,发现timer停止了定时请求(失效了,很奇怪...)threed_addDevice = new Thread(new ThreadStart(addDeviceForm));
threed_addDevice.Start();public void addDeviceForm()
        {
            XmlHelper xml = new XmlHelper("DevConfig.xml");            List<DevConfig> config = xml.GetDeviceConfig();            foreach (DevConfig dc in config)
            {
                frmDevice dev = new frmDevice(dc);                if (dockPanel_Main.InvokeRequired)
                {
                    dockPanel_Main.Invoke(new addDevFormHandler(newDevForm), new object[] { dev });
                }
                else
                    newDevForm(dev);
            }
        } frmDevice 表示一个设备(也就是当作服务器的PLC),在new的时候 构造函数会尝试建立connect
建立连接后,抛出事件,外层的调用捕捉到事件后,启动timer1.start();2.定时send数据到服务器,理论上要求,发送一个请求,客户端就接收到一串字符
假定客户端发送:ask data
服务端返回数据理论上是 message from server但是,收到的数据绝大多数都是 message from servermessage from servermessage from server
也就是说重复了3次,还有少量的是重复了4次的,重复2次的也有!那么,如何保证这种客户端发送一个请求命令,就只接收到服务端返回的一串数据呢?

解决方案 »

  1.   

    可以把你的程序发给我看看么[email protected]因为完全重现一次你的这个情况需要时间 而且也不一定完全一样
      

  2.   


    可以,马上就发给你,不过刚开始写,也刚开始接触winform,有点难
      

  3.   

    没有使用同一个端口,在connect的时候,系统会自动为每个socket分配一个不一样的端口
    可能是连续的几个,也可能不连续想把源项目代码贴出来,其实也不多,想搞懂socket,刚接触,一头雾水,涉及到多线程和同步异步
    什么的,就复杂了
      

  4.   

    发一份源代码到[email protected]
    反正闲着帮你看看
      

  5.   

    换个头像,省得天天被围观...看来在CSDN现在越来越难得到帮助了
      

  6.   

    [email protected]
    我帮你看看吧
      

  7.   


    如果你new 4个线程去处理 connect的话 timer的定时请求就无必要了。 所以timer可以不用。
    因为你4个线程都在运行生命期里面。只要保持4个线程的死循环即可。
    然后每个线程sleep x秒之后执行发送命令的函数即可。所以:虽然我没时间研究为什么 4个线程和 timer 为什么没有按你预期去运行但是我可以确定的是 你如果new了4个线程,并且每个线程操作一个socket的话 那么这个逻辑不用timer也能很简单的完成你的需求。4个线程,每个都有自己的 while(true){请求,处理,sleep...}  这个不需要说太多吧。很简单的逻辑。