现在我要用winfrom 做个多线程的程序 比如 生成10个线程 去修改 DataTable 里面的的值,Datablale有100行数据
我要用10线程去分别修改dataTable,如果10个线程中有一个线程先完毕了,然后立即去修改下一条数据比如是第11行然后再发现有线程完毕了再用线程去执行第12条(1个线程执行一行)。以此类推,一直到10线程把100行数据都修改掉。
我应该怎么做,请各位大侠请教!分不够可以加!

解决方案 »

  1.   

    举个例子:第一步:线程先读一条未处理的记录,
       select min(主键) 编号  from 表 where 线程号=0第二步:   update 表 set 线程号={自身线程号} where 编号={选出的编号} and  线程号=0第三步:
       然后筛选属于自己线程的任务:
       select * from 表 where 线程号={自身线程号}因为可能多个线程读到同一条记录,所以第二步可能更新不到记录,第三步也就读不到记录,
    第三步若读不到记录,再重新从第一步开始执行:如果第三步读到记录,就开始处理记录。
    开启事务,
    处理
    提交/回滚.但这个存在一个问题,
    如果执行到第三步,而且能读到记录,然后处理,但处理中途,该线程死掉,
    就会导致这条记录一直挂在那个线程上,再没有别的线程能够处理该记录。所以需要设置一个延时时间,如果线程接受处理该记录,但超过指定时间,还没提交,
    则需要关闭该线程,然后删除线程号,给别的线程来处理。
      

  2.   

    没必要这么复杂,就用lock锁定分配就行,class XXX
    {
    Object rLock=new Object();DataTable tTable=new DataTable();int nCurRowIndex=0;private DataRow GetRowToProcess()
    {
        lock(rLock)
        {
              if (nCurRowIndex>=tTable.Rows.Count)
              {
                    return null;
              }
              DataRow rResult=tTable.Rows[nCurRowIndex];
              nCurRowIndex++;
              return rResult;
        }
    }//这个是线程函数
    void DoProcess()
    {
           while(true)
           {
                DataRow rRow=GetRowToProcess();
                if (rRow==null)
                {
                  break;
                }            //...这里处理rRow,
            }
    }}
      

  3.   

    楼上,你的 nCurRowIndex 要不要锁?
      

  4.   

    其实还有一种简单的而且保险的做法,
    需要定义两个DataTable,
    一个是处理的DataTable1,一个是用来备份的DataTable2,线程获取 DataTable1 里的一条记录来处理,获取时,将DataTable1锁住,
    取出一条记录后,将该记录从DataTable1里删掉,然后释放锁,
    然后处理该记录,处理完后,再锁住DataTable2,将处理的结果更新回DataTable2,释放锁。