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的数据,记录特征。保证效率。