最近在改服务,比较急的,在线等,有经验的帮助下吧。
有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--;
}
}
}
有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--;
}
}
}
监听线程收到消息后发出一个消息给数据库处理线程AutoResetEvent m_recevieEvent = new AutoResetEvent();// 接收函数
int i=sock.Receive(mybyte); //socket接受消息
...
if(msg=="start")
{
m_recevieEvent.Set();
}// 数据库处理线程就等待这个消息
while(true)
{
m_recevieEvent.Wait();
// 处理你的逻辑...
}
这是我现在只能用单线程的原因。如果多线程的话,那么只能等前一个线程完成再执行。
如果数据库那每次查询待处理表里,然后执行单条的操作的话,通过TCP的SOCKET监听线程里设个变量做计数器,然后计数器里有几次,就调用线程几次,很可能会漏掉。
如果数据库那每次查询待处理表然后执行所有的话,计数器就没必要,但我也不知道哪些已经做掉了哪些还没做掉,关键的问题是执行数据库操作比较慢,执行了一半的时候再收到消息怎么办。