C#进程问题

rainlove2010 2012-05-08 02:07:40
大家好,请教一个问题呗。
我现在在程序中做了两个线程分别是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表中
}
}

请问进程停止是哪个进程的问题呢?请不吝赐教。
...全文
236 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
rainlove2010 2012-05-14
  • 打赏
  • 举报
回复
换了一种方式解决了,谢谢大家。
rainlove2010 2012-05-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
不停的查询sql 有那么多资源吗? 一次性加载A2的数据,记录特征。保证效率。
[/Quote]

一次性加载A2数据,怎么可以判断哪条数据是被锁定的?有什么好的方法吗?请赐教
NewUser2008 2012-05-08
  • 打赏
  • 举报
回复
不停的查询sql 有那么多资源吗? 一次性加载A2的数据,记录特征。保证效率。
rainlove2010 2012-05-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
你搞反了吧? 应该先检查死锁数据 再进行数据迁移的

C# code

for (int i = 0; i < dt.Rows.Count; i++)
{
ParameterizedThreadStart ParStart = new ParameterizedThreadStart(LockThreadMethod);
Thread myThread = new Thr……
[/Quote]

没有反,因为要查询的表数据量非常非常大,所以就是想在数据更新过程中,如果遇到锁定的行,就通过T2线程将锁定行记录,一条一条的找。
ChargeForward 2012-05-08
  • 打赏
  • 举报
回复

public void ThreadMethod(object ParObject)
{
Thread.Sleep(10000);
while (bTheadFlag)
{



public void LockThreadMethod(object ParObject)
{
lock (oLock)
{
//将锁定的数据插入到A3表中
}
}
ChargeForward 2012-05-08
  • 打赏
  • 举报
回复
你搞反了吧? 应该先检查死锁数据 再进行数据迁移的

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

ChargeForward 2012-05-08
  • 打赏
  • 举报
回复
你去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);
rainlove2010 2012-05-08
  • 打赏
  • 举报
回复
T1线程在执行更新A2表操作时,因为碰到一条锁定记录,线程被锁死。这时候,T2线程开始运行,将这条锁定记录插入另一表中。当T2线程执行完插入操作后,不会再重新执行T1线程了吗?
rainlove2010 2012-05-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
有点乱,线程问题跟进程混一起?
看不出来A2行为什么锁定? 如何释放?
如果不释放,再怎么处理也没用,除非结束.
[/Quote]
就是线程,A2表中行数据有的被锁定了,不知道为什么被锁定了,不释放这些锁定的行。
就是想把锁定的记录记录到另一个表,然后继续通过T1线程更新下面的记录。
不知道想法对不对。
只在此山中 2012-05-08
  • 打赏
  • 举报
回复
有点乱,线程问题跟进程混一起?
看不出来A2行为什么锁定? 如何释放?
如果不释放,再怎么处理也没用,除非结束.
NewUser2008 2012-05-08
  • 打赏
  • 举报
回复
搞这么复杂,把A2表数据加载到内存中,然后 分次查询A表,处理。 如果数据量大的话,则每隔一段时间更新A2表

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧