最近在改服务,比较急的,在线等,有经验的帮助下吧。
有2个服务。第一个服务用来处理提交的信息,然后把信息存到数据库的表里。
第二个服务用来从数据库的表里读取信息,进行下一步操作,然后把处理过的数据删除。 之所以没放在一个服务里是为了可以放在2台服务器上运行。本来第二个服务是每隔5分钟去数据库看下有没有东西,用的线程,执行完sleep。但是延迟太久,必须是实时的去处理。如果不设延迟始终去数据库读,又对数据库造成压力。
所以现在考虑在第一个服务执行完存数据库的操作后,用TCP发个消息(随便一句话,不包含有价值的信息)给第二个服务,第二个服务始终监听端口,收到消息去数据库读信息,来达到无延迟。
第二个服务的执行时间比较长,极有可能第一个消息发来开始处理,处理了一半的时候第二、第三个消息也来了。本人对线程并不是很熟悉,特来求助该怎么写。有考虑过设个变量作为计数。但是好像while(intcount>0)不循环完不行,循环的过程中加数还会有问题,intcount连负数都有了。                                   private int intcount=0;
                                    .............
                                      while(listening) //这个是监听到然后执行
{  
Socket   sock=listener.AcceptSocket();
byte[]   mybyte=new   byte[1024]; 
int   i=sock.Receive(mybyte);                                 //socket接受消息  
string   msg=System.Text.Encoding.UTF8.GetString(mybyte);        //编码  

if(msg.Equals("start"))
{
intcount++;
while(intcount>0)
{
执行第二个服务方法
intcount--;
}
}
}  

解决方案 »

  1.   

    不熟悉就不要用Thread, 直接用System.Timers.Timer类,封装好了的。
      

  2.   

    用Timer来设间隔时间吗? 那个没有意义啊,我要的是即时响应的
      

  3.   

    这是一个典型的生产者/消费者同步问题。你的第二个服务可以分为两个线程,一个监听网络数据,接受来自网络上的通知。另一个线程进行数据库数据的读取。两个线程之间用信号量或Event进行同步。
      

  4.   

    你可以用AutoResetEvent来等待
    监听线程收到消息后发出一个消息给数据库处理线程AutoResetEvent m_recevieEvent = new AutoResetEvent();// 接收函数
    int  i=sock.Receive(mybyte);  //socket接受消息  
    ...
    if(msg=="start") 

      m_recevieEvent.Set();
    }// 数据库处理线程就等待这个消息
    while(true)
    {
      m_recevieEvent.Wait();
      // 处理你的逻辑...
    }
      

  5.   

    用AutoResetEvent来调用数据库的线程的话,那么数据库的线程还没处理完,socket又监听到了发来的消息怎么办那?再起个数据库的线程? 问题是如果起多个数据库线程同时做的话,将有很大可能引起死锁。
    这是我现在只能用单线程的原因。如果多线程的话,那么只能等前一个线程完成再执行。
      

  6.   

    现在的机制是这样的,数据库需要处理的事情,第一个服务会一条一条插入待处理表,每插入一条,通过TCP给监听端个消息,来通知有新的待处理。然后第二个执行数据库的服务,去待处理表查询,处理完一条,就把待处理表删除掉一条。
    如果数据库那每次查询待处理表里,然后执行单条的操作的话,通过TCP的SOCKET监听线程里设个变量做计数器,然后计数器里有几次,就调用线程几次,很可能会漏掉。
    如果数据库那每次查询待处理表然后执行所有的话,计数器就没必要,但我也不知道哪些已经做掉了哪些还没做掉,关键的问题是执行数据库操作比较慢,执行了一半的时候再收到消息怎么办。