代码如下 线程开始后 怎么停不掉??
看网上说一般过几秒钟后就会停止掉抛异常的
我等了几分钟还是停不掉 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();
        }

解决方案 »

  1.   

    存储过程执行本来就要那么长时间, 所以就慢了你的代码有问题  LoopAccessData没有异常处理, 数据库访问也不是事务的, 出异常时应该回滚事务
      

  2.   

    要停止一个正在执行的存储过程。 没办法帮你试了结你几个办法, 可以试试, 不保证试成功啊1. LoopAccessData加入catch, catch块里加入con.Close(), 试下连接关闭时, 正在执行的存储过程会不会结束。 
    2. 存储过程用事务的方式来执行, transaction = con.BeginTransaction(); 在LoopAccessData的catch里面加入transaction.Rollback, 试下回滚会不会有反应t.Abort();时, 可以进入到LoopAccessData的catch块3. 找一个可以停止数据库存储过程的方法, btnEnd_Click里结束线程的同时, 再一次连接到数据库, 把存储过程给停了
      

  3.   

    1.2 测试了下 根本没有进入LoopAccessData   catch块 
    死在com.ExecuteNonQuery()了3应该可以实现效果 但是不是解决我线程的问题还有谁知道 问题么 怎么停不掉 要怎么样才能停掉
      

  4.   

    com.ExecuteNonQuery(); 这个地方可以理解为等待数据库执行完成返回,独立的, 是等待......你可以从数据库连接上断,线程无权控制
      

  5.   

    线程是一个系统用来执行代码的单元,当你交给它的代码执行完毕(返回或结束)后,自然就停止了。所以想停止一个线程就要使其执行的方法停止或返回
    private volatile bool _shouldStop;
    while(!_shouldStop)
    {
      // do something
      Thread.Sleep(10000);//适当的使线程放弃执行资源获取的机会,可以帮助系统调整资源调配,有助于  系统和程序的稳定。
    }
    要停止时,只要将_shouldStop设为 true就可以了
      

  6.   


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

  7.   

    一般kill线程不用Abort()来终止线程。会引发一个异常的。用join就可以了!