大家好,请教一个问题呗。
我现在在程序中做了两个线程分别是T1和T2.
T1线程是从一个表(A1)中查找数据,然后将从A1表中查找到的数据与A2表匹配,更新到另一个表A2中.
但是因为A2表中有些行是锁定状态,无法进行更新,在更新时,T1进程就被锁死了,所以做了T2进程。T2进程是用来将A2表中被锁定而不能更新的的行数据记录到另一个表(A3)中。这样当T1进程在运行时,判断如果改行被锁死(即在A3表中存在),直接跳过这一行,继续向下更新。但是在执行中,遇到的问题是:进入T2线程后,锁定的航记录添加到A3表之后,不再继续运行T1线程,直接退出程序了,
代码大致如下:进程创建:
 public void NewMethod()
{
           
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                ParameterizedThreadStart ParStart = new ParameterizedThreadStart(ThreadMethod);
                Thread myThread = new Thread(ParStart);
                myThread.Start(this);
            }            ParameterizedThreadStart OutParStart = new ParameterizedThreadStart(LockThreadMethod);
            Thread myOutThread = new Thread(OutParStart);
            myOutThread.Start(this);
 }T1进程:
public void ThreadMethod(object ParObject)
{
    while (bTheadFlag)
    {
          //根据Primary Key,拼接新的查询语句,在A2中查询与A1有相同Primary Key的数据
           sRhSql = "SELECT * FROM A1 WHERE XH='AAA';
           destReader = oraDB.ExecuteReader(sRhSql, keyPraramenters);            //存在,对A2中该条数据更新
            if (destReader.Read())
            {
                 Find record in LOCKRECORDS
                 sRhSql = "SELECT ID,XH FROM LOCKRECORDS WHERE ID='"+ID+"'";
                 dLockRecReader = oraDB.ExecuteReader(sRhSql);      
                  //在A3表中查找该记录是否该记录被锁定
                   sRhSql = "SELECT ID,XH FROM A3 WHERE ID='"+ID+"'";
                   dLockRecReader = oraDB.ExecuteReader(sRhSql);                   while (dLockRecReader.Read())
                   {
                        //被锁定时,退出不更新
                        if (dLockRecReader["ID"].ToString().Trim().Equals(ID.Trim()) && dLockRecReader["XH"].ToString().Trim() == dtReader["XH"].ToString().Trim())
                        {
                             bLockRecord = true;
                             break;
                         }
                    }         
                    //未被锁定
                    if (!bLockRecord)
                    {     
                        //执行更新A2数据操作
                     }
              }
       }
}T2进行如下:
public void LockThreadMethod(object ParObject)
{
     Thread.Sleep(10000);
     lock (oLock)
     {
         //将锁定的数据插入到A3表中
     }
}请问进程停止是哪个进程的问题呢?请不吝赐教。

解决方案 »

  1.   

    搞这么复杂,把A2表数据加载到内存中,然后 分次查询A表,处理。     如果数据量大的话,则每隔一段时间更新A2表
      

  2.   

    T1线程在执行更新A2表操作时,因为碰到一条锁定记录,线程被锁死。这时候,T2线程开始运行,将这条锁定记录插入另一表中。当T2线程执行完插入操作后,不会再重新执行T1线程了吗?
      

  3.   

    你去google下 前台线程和后台线程区别
    for (int i = 0; i < dt.Rows.Count; i++)
      {
      ParameterizedThreadStart ParStart = new ParameterizedThreadStart(ThreadMethod);
      Thread myThread = new Thread(ParStart);  myThread.IsBackground = false;  myThread.Start(this);
      }  ParameterizedThreadStart OutParStart = new ParameterizedThreadStart(LockThreadMethod);
      Thread myOutThread = new Thread(OutParStart);  myOutThread.IsBackground = false;  myOutThread.Start(this);
      

  4.   

    你搞反了吧?  应该先检查死锁数据  再进行数据迁移的for (int i = 0; i < dt.Rows.Count; i++)
      {
      ParameterizedThreadStart ParStart = new ParameterizedThreadStart(LockThreadMethod);
      Thread myThread = new Thread(ParStart);  myThread.IsBackground = false;  myThread.Start(this);
      }  ParameterizedThreadStart OutParStart = new ParameterizedThreadStart(ThreadMethod);
      Thread myOutThread = new Thread(OutParStart);  myOutThread.IsBackground = false;  myOutThread.Start(this);
      

  5.   


    public void ThreadMethod(object ParObject)
    {
      Thread.Sleep(10000);
      while (bTheadFlag)
      {public void LockThreadMethod(object ParObject)
    {
      lock (oLock)
      {
      //将锁定的数据插入到A3表中
      }
    }
      

  6.   

    不停的查询sql 有那么多资源吗?  一次性加载A2的数据,记录特征。保证效率。