解决方案 »

  1.   

    本帖最后由 caozhy 于 2014-07-27 23:32:11 编辑
      

  2.   

    嗯,我之前也是用的while,后来想试试异步改成了if
    while和if在这个问题上影响暂时还不是很大。
    帮我看看有什么方法能让取出的速度大于写入的速度。
      

  3.   

    if (appServer.DataQueue.Count > 0) 
    修改为
    if (appServer.DataQueue.Count > 0 && appServer.DataQueue.Count < xxx)
    如果插入过快,就让它阻塞下。 
      

  4.   

    个人感觉问题不出在queue的使用上,问题出在数据入库的操作上。
    把数据入库效率解决了,就没有啥问题了。 
    如果后台数据库使用的是sqlserver,可以考虑采用批量写入
    bulk insert。
    -----------------------
      

  5.   

    一个理发师10分钟服务一位客户,也就是一小时可以服务6位客户
    如果每小时新增10位客户,排队客户只会越积越多。简单的更改分号/叫号的方式(while/if等等),是不能解决客户越积越多的问题的。
    真正的解决方法就是:
    1、限制客户(你认为不可采用)
    2、增快处理速度。如何增快处理速度,要具体看你Common.InsertData的具体瓶颈在那里。1、如果瓶颈在于网络延时,可以采用多个DealDataQueue线程(多个理发师),或采用批处理的方式,比如服务端增加批处理支持Common.InsertMultiData。
    2、如果是数据库入库处理过长,则要优化数据库入库查询(提高理发师的速度)。另:你的queue没有同步,在多线程下有潜在问题。
      

  6.   

    个人感觉问题不出在queue的使用上,问题出在数据入库的操作上。
    把数据入库效率解决了,就没有啥问题了。 
    如果后台数据库使用的是sqlserver,可以考虑采用批量写入
    bulk insert。
    -----------------------
    入库效率确实是有问题,目前的数据结构是一个客户端一个表,时间长了,表记录数太多,影响了insert效率,准备改成一天一个表。
    但我想知道如果我服务端接收了1W个客户端的链接,入队列和出队列怎么平衡?
      

  7.   

    你好,同步是Queue.Synchronized(queue)这样吗?
      

  8.   


    Queue.Synchronized(queue)不够。
    因为你先判断Count ,然后Dequeue,这是两个操作。
    两个操作需要在lock(queue.SyncRoot)保护下运行。
      

  9.   

    大致看了下,你很多地方使用了
    System.Threading.Thread.Sleep(5);
    也就是说,其他什么操作都不耗时间的话,你也就是执行200次/秒。
    你确认数据量这么小?
    否则,阻塞是肯定的,也就是出现你这种情况。
      

  10.   

    个人感觉问题不出在queue的使用上,问题出在数据入库的操作上。
    把数据入库效率解决了,就没有啥问题了。 
    如果后台数据库使用的是sqlserver,可以考虑采用批量写入
    bulk insert。
    -----------------------
    入库效率确实是有问题,目前的数据结构是一个客户端一个表,时间长了,表记录数太多,影响了insert效率,准备改成一天一个表。
    但我想知道如果我服务端接收了1W个客户端的链接,入队列和出队列怎么平衡?
    把性能瓶颈解决了,不需要进行平衡。
    不知道LZ在Server侧使用的哪种socket模块?
    从500扩展到1w客户端,Socket + Asynchronous估计撑不住
    还有11楼大牛提到的同步问题要注意,特别是在大并发的情况下,
    不处理会导致脏数据出来。
      

  11.   

    我程序是winform,不sleep界面会卡着。
      

  12.   

    个人感觉问题不出在queue的使用上,问题出在数据入库的操作上。
    把数据入库效率解决了,就没有啥问题了。 
    如果后台数据库使用的是sqlserver,可以考虑采用批量写入
    bulk insert。
    -----------------------
    入库效率确实是有问题,目前的数据结构是一个客户端一个表,时间长了,表记录数太多,影响了insert效率,准备改成一天一个表。
    但我想知道如果我服务端接收了1W个客户端的链接,入队列和出队列怎么平衡?
    把性能瓶颈解决了,不需要进行平衡。
    不知道LZ在Server侧使用的哪种socket模块?
    从500扩展到1w客户端,Socket + Asynchronous估计撑不住
    还有11楼大牛提到的同步问题要注意,特别是在大并发的情况下,
    不处理会导致脏数据出来。
    用的是江大鱼的SuperSocket。
    从今天跑的情况来看,未同步确实出现了问题。dequeue的东西转化的类型不对。
      

  13.   

    我程序是winform,不sleep界面会卡着。主线程的循环?可以用application。doevent试试。