比如,数据库表  sheeta  中有n条记录(n未知),  
现在,我需要读取sheeta中的记录,采用10个线程并发执行,每个线程取一条记录,线程存活时间为60分钟,每个记录的线程执行结束后,则继续从sheeta  中读取一条记录,直到所有记录全部遍历,或者有外来终止指令来终止线程执行。  
 
恳请各位大侠指点,最好能给出程序示例,谢谢:)

解决方案 »

  1.   


    我觉得主要防止一个线程读了记录A后,另一个线程还会去读A...可以利用lock或Mutex类防止此类事情发生,其他应该和单线程读取一致了吧...
      

  2.   

    lock或Mutex针对的好象都是表吧,楼上的话...
      

  3.   

    按楼上提示:
    是不是可以这样,在sheeta中加个标记字段flag,
    flag=1 则,表示线程已经读取
    flag=0 表示未读取
    flag=2 表示已经执行结束按照flag来读取新的记录。有更好的方法吗?我初学c#,最好能有个代码例子我想采用 threadpool方法,但是对线程操作还很不熟,这个是我第一次接触。。
      

  4.   

    Table:
    ID   NameCode:
    int currentID=0;
    private void MyThreadInfo()
    {
    string sql="";
    lock(this)
       {
           //读取一条记录,并将当前ID后延
           sql="select * From Table Where ID=" + currentID++;
       }
    }
      

  5.   

    lock(this) 

    outitem.MsgState =(int)MSG_STATE.SENDING; 
    this.delFromOutQueue(seq); 
    this.addToWaitingQueue(outitem);  
    }
      

  6.   

    xrwang(无涯):
     
      是简单了,但是,每个记录的数据处理所需要的时间不一样,而且是未知的,这样会导致无法进行合理的分组,多线程也就没有使用的意义了
      

  7.   

    楼上有个方法:加个标记字段flag 可以实现
    或是: 
    为每条记录加个序号,每个读取记录时在一个全局变量中记录该序号,修改其值时先lock(),下次取的时候都从比这个序号大的一个开始
      

  8.   

    用lock就可以搞定,线程自己会suspend
      

  9.   

    ManualResetEvent stop = (ManualResetEvent)stopEvent;
    while(!stop.WaitOne(0,false)))
    {  
    }WaitOne(0,false) 究竟是什么意思?
      

  10.   

    因为你要放防止某个线程取出来的数据不要被别的线程取出来,如果要完成这个功能,你就需要在前端来获得需要更新的记录集,例如每次10个,然后每个子线程在单独读记录集里固定的记录行,进行处理。
    要说每个处理线程单独开一个connection,我觉得也不太可能,而每个线程一次只处理一条或几条,总觉得效率没提高多少。
      

  11.   

    这几天有其他事情,事情忙完了,继续搞:)Knight94(愚翁) 
      你的方法可能比较适合。