小弟有10个服务器想要查询,然后累加统计数据,所有我就掉了10个线程分别从10个数据库中读取数据,现在发现一个问题,每个库的读取时间都不通,最后主线程在累加10个数据库的数据的时候往往出现其中的线程还没有从数据库中读到数据的问题,所以主线程的记录集就没有实例化,请各位看看如何解决这个问题

解决方案 »

  1.   

    显然,是你的主线程与子线程同步的问题,你可以在主线程等一下子线程,例如用Join等,或用信号量。
      

  2.   

    谢谢 Knight94(愚翁),但是我还有一个问题,就是我在调用进程的时候  我并不知道那个进程执行的速度比较快,如果我用join函数的话,我就喜欢用一个循环来添加join了,这样就等于一个进程一个进程的处理, 但是我觉得我做的操作在程序上运行的时间其实不多,主要在数据库的访问上,能否我先提交所有的进程,然后进行等待,在等待的时候10台服务器同事进行查询,这样可以并发,然后等个一段时间,然后再join一下,等待处理结果。
    不过这样的话万一第一个进程访问的时间特别长不是还是没有效果嘛?这样应该如何处理呢?请大家给予帮助
      

  3.   

    JasonHeung(拥有一切也只不过这样笑着哭) 朋友,你的意思是否在填充每个查询记录集的时候修改标记位呢?然后用一个轮循判断是否所有的查询都执行完毕,但是这样做是否处理的效率有点差呢?不过谢谢你的建议,我在尝试
     Knight94(愚翁) waitall()我以前没有用过,我在找这方面的资料,能够给出一些例子呢?
      

  4.   

    JasonHeung(拥有一切也只不过这样笑着哭) 说的方法是可行的,对于这种情况,我没想出过更好的办法
      

  5.   

    我也觉得使用JasonHeung(拥有一切也只不过这样笑着哭)说的方法比较好,如果主线程是不需要用户交互的是完全没有问题的,但如果主线程是个窗口之类的就不太好,最好再放个线程来处理这个汇总的问题。
      

  6.   

    既然这样,那你为什么不在线程结束时用回调方法将获得的查询结果返回给主线程呢?
    然后主线程可以根据回调发生的次数知道一共返回了多少个结果而不必关心每个线程返回的顺序不是么。
    实际上问题的本质在于你想知道一共有多少线程返回了结果,而并不关心顺序对么。那么就没有必要在住县城中用WaitHandle或者Join这样的方法去等待不是么。
      

  7.   

    还有,如果这10个服务器都是SQL Server或者OLEDB兼容的数据库,可以在SQL Server中将这些服务器填加为链接服务器然后使用分布式查询,这样用一个SQL语句就能够获得结果了
      

  8.   

    duxinrun(晴天坊)说的对,我并不关心每个进程的先后顺序,我只关心最后的结果,还有怎么有效的把获得数据,你说的回调的方法我到没有想到,可以尝试一下,谢谢
      

  9.   

    可以使用线程池来根据应用程序的需要更为有效地利用多个线程。许多应用程序使用多个线程,但这些线程经常在休眠状态中耗费大量的时间来等待事件发生。其他线程可能进入休眠状态,并且仅定期被唤醒以轮询更改或更新状态信息,然后再次进入休眠状态。使用线程池就可以为应用程序提供一个由系统管理的辅助线程池,从而使您可以集中精力于应用程序任务而不是线程管理。实际上,如果要执行一些需要多个线程的较短任务,则使用 ThreadPool 类是利用多个线程的最方便且最好的方法。使用线程池能够优化这些任务的执行过程,从而提高吞吐量,它不仅能够使系统针对此进程优化该执行过程,而且还能够使系统针对计算机上的其他进程优化该执行过程,即使您的应用程序对这些进程一无所知,系统也能做到这一点。使用线程池使系统能够在考虑到计算机上的所有当前进程后对线程时间片进行优化。
      

  10.   

    给你个地址:
    ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/csref/html/vcwlkThreadingTutorial.htm
    如果你装了Vs2003.net的话