C# 线程停止的问题

impwork 2010-12-27 10:41:19
代码如下 线程开始后 怎么停不掉??
看网上说一般过几秒钟后就会停止掉抛异常的
我等了几分钟还是停不掉 WHY?
请高手指点下

Thread t = null;
//开始
private void btnStart_Click(object sender, EventArgs e)
{
t = new Thread(new ThreadStart(LoopAccessData));

t.IsBackground = true;
t.Start();
}

//停止
private void btnEnd_Click(object sender, EventArgs e)
{
try
{
t.Abort();
}
catch (ThreadAbortException err)
{

}
}
//线程体
void LoopAccessData()
{
OracleConnection con = new OracleConnection("data source=xx;User ID=xx;Password=xx");
OracleCommand com = con.CreateCommand();
com.CommandText = "sp_test_threadloopdata";
com.CommandType = CommandType.StoredProcedure;
con.Open();
com.ExecuteNonQuery(); // 非常非常的久
con.Close();
}
...全文
251 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
flybird811 2010-12-28
  • 打赏
  • 举报
回复
代码没有问题,
echoxue 2010-12-28
  • 打赏
  • 举报
回复
一般kill线程不用Abort()来终止线程。会引发一个异常的。用join就可以了!
echoxue 2010-12-28
  • 打赏
  • 举报
回复

try
{
t.join(20000);//写入你线程的执行时间
}
catch (ThreadAbortException err)
{

}

李先生2017 2010-12-28
  • 打赏
  • 举报
回复
线程是一个系统用来执行代码的单元,当你交给它的代码执行完毕(返回或结束)后,自然就停止了。所以想停止一个线程就要使其执行的方法停止或返回
private volatile bool _shouldStop;
while(!_shouldStop)
{
// do something
Thread.Sleep(10000);//适当的使线程放弃执行资源获取的机会,可以帮助系统调整资源调配,有助于 系统和程序的稳定。
}
要停止时,只要将_shouldStop设为 true就可以了
visir 2010-12-27
  • 打赏
  • 举报
回复
要停止一个正在执行的存储过程。 没办法帮你试了

结你几个办法, 可以试试, 不保证试成功啊

1. LoopAccessData加入catch, catch块里加入con.Close(), 试下连接关闭时, 正在执行的存储过程会不会结束。
2. 存储过程用事务的方式来执行, transaction = con.BeginTransaction(); 在LoopAccessData的catch里面加入transaction.Rollback, 试下回滚会不会有反应

t.Abort();时, 可以进入到LoopAccessData的catch块

3. 找一个可以停止数据库存储过程的方法, btnEnd_Click里结束线程的同时, 再一次连接到数据库, 把存储过程给停了

impwork 2010-12-27
  • 打赏
  • 举报
回复
写的测试代码 存储过程里故意做的 要执行几天都执行不完
我现在的问题是 要怎样才能把它停止掉
我等了十多分钟了还是停止不掉 这样肯定不行啊
visir 2010-12-27
  • 打赏
  • 举报
回复
存储过程执行本来就要那么长时间, 所以就慢了

你的代码有问题 LoopAccessData没有异常处理, 数据库访问也不是事务的, 出异常时应该回滚事务
sprc_lcl 2010-12-27
  • 打赏
  • 举报
回复
com.ExecuteNonQuery(); 这个地方可以理解为等待数据库执行完成返回,独立的, 是等待......

你可以从数据库连接上断,线程无权控制
impwork 2010-12-27
  • 打赏
  • 举报
回复
1.2 测试了下 根本没有进入LoopAccessData catch块
死在com.ExecuteNonQuery()了

3应该可以实现效果 但是不是解决我线程的问题

还有谁知道 问题么 怎么停不掉 要怎么样才能停掉

110,571

社区成员

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

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

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