日期:2014-05-18  浏览次数:21189 次

C#进程问题
大家好,请教一个问题呗。
我现在在程序中做了两个线程分别是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表中
  }
}

请问进程停止是哪个进程的问题呢?请不吝赐教。

------解决方案--------------------
搞这么复杂,把A2表数据加载到内存中,然后 分次查询A表,处理。 如果数据量大的话,则每隔一段时间更新A2表
------解决方案--------------------
你搞反了吧? 应该先检查死锁数据 再进行数据迁移的
C# code

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);

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