中间件服务器中,一个客户端连接上来,必须启动一个TCP去连接某个应用服务器,由于应用服务器中有若干指令需要交付,因此必须等待这些指令均完成,然后才给客户端一个反馈,请问如何实现一个等待,就是等待与应用服务器之间的指令完成。本题要点:1、同一子线程,若是使用While等的等待判断,会影响与应用服务器之间的通讯。
          2、等待之时不可以影响与应用服务器之间的通讯。
          3、应用服务器程序并非本人开发,因此无法调整应用服务器的模式。

解决方案 »

  1.   


    void OnClientConnect(int token)
    {
        if( token == 0 )
        {
            token = QueueApplicationServerTask();
        }
        Status status = WaitForTask(token, timeout);
        if ( status == Status.Done )
        {
            ClientOK(token);
        }
        else if( status == Status.Pending )
        {
            ClientPleaseTryAgain(token);
        }
    }
      

  2.   

    看来lz的调用环境是异步的,可以试试用AutoResetEvent做通知
      

  3.   

    QueueApplicationServerTask、WaitForTask这两个是啥?AutoResetEvent好像不好使,我用过ManualResetEvent,会导致线程阻塞
      

  4.   


    对于你只有一个wait的情况,这两个是完全一样的(甚至代码都是一模一样的)。它们都是导致线程阻塞,从而你的系统中有大量线程同时被阻塞。系统的线程池是有限的。如果不使用线程池,而是随便new线程,那就更浪费管理时间了。对于发送、接收数据,你可以考虑使用异步操作。比如对于TcpClient来说,使用 .GetStream().BeginWrite(...) 和 .GetStream().BeginRead(...),而不是 Write和Read,这样避免系统中有太多的被阻塞线程。
      

  5.   

    2楼够意思,给了个代码片段,至少目前我认为是代码片段,简直文不对题,还好搜索引擎帮了忙,让我看到了关键字Task,感觉我的这个需求可以使用Task来解决。
      

  6.   


    我用Task实现了,但是由于之前有用到一个回调函数,因此导致了又阻塞,后来发现了,删除了这个回调函数就可以了。另外,用Task的情况下,可以不要回调函数,直接用ref就可以了。
    因此,我认为线程之间用回调函数的话可能也会引起阻塞,或许之前就是因为这个回调函数阻塞了。