当前位置:编程学习 > C#/ASP.NET >>

线程和递归的运用

最近写了一段小代码 ,想了解线程的应用,但是发现递归和线程用到一起就会出现堆栈溢出的问题 。不知道怎么解决,请教高手帮忙
下面是我的实例代码
 DataTable dt = new DataTable();
        System.Threading.Thread th;
        private void button1_Click(object sender, EventArgs e)
        {
           th = new System.Threading.Thread(new System.Threading.ThreadStart(star));
            th.Start();
        }
        private void star()
        {
            try
            {
                int i = 0;
                i++;
                CheckForIllegalCrossThreadCalls = false;
                dt.Rows.Clear();
                System.Threading.Thread.Sleep(10);
                
                star();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }


---------------------------------------------------------------------
上面会报错
未处理的“System.StackOverflowException”类型的异常出现在 System.Data.dll 中。
--------------------编程问答-------------------- 和多线程一点关系都没有
你将你的递归代码弄到一个线程里,一样溢出

递归没有出口,无限循环,当然溢出。。。 --------------------编程问答-------------------- 是呀,跟线程没有关系,是你的递归的问题 --------------------编程问答--------------------
引用 1 楼 xiao_p 的回复:
和多线程一点关系都没有
你将你的递归代码弄到一个线程里,一样溢出

递归没有出口,无限循环,当然溢出。。。


同意楼上说的,在一个程序中,这些独立运行的程序片断叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。多线程处理一个常见的例子就是用户界面。利用线程,用户可按下一个按钮,然后程序会立即作出响应,而不是让用户等待程序完成了当前任务以后才开始响应。
--------------------编程问答--------------------
引用 1 楼 xiao_p 的回复:
和多线程一点关系都没有
你将你的递归代码弄到一个线程里,一样溢出

递归没有出口,无限循环,当然溢出。。。


不太同意,递归怎么就没有出口了,如果没有的话,那么不用线程 循环调用一样会溢出, 
当然有出口,要不然递归还怎么用,达到条件就是出口了, 至于LZ的问题首先看递归是不是死递归,然后看线程调用, 这个应该没问题,我怀疑是你递归算法有问题, 如果没问题,线程去调用要考虑到一点, 线程每次去调用递归的时间是否要大于递归运算的时间如果小于当然是死循环,  比如说线程5秒去调一次,而递归 算法要6秒你说会怎么样? --------------------编程问答--------------------
引用 1 楼 xiao_p 的回复:
和多线程一点关系都没有
你将你的递归代码弄到一个线程里,一样溢出
递归没有出口,无限循环,当然溢出。。。

代码有问题吧,估计不是C井的问题吧.
--------------------编程问答-------------------- 那如果不用递归,改用循环。会是相同的结果吧 ,
看了大家的回帖我也明白了饿,这个主要问题是出现在了我的递归上面。
那有没有办法在下一次递归时,释放上一次的堆栈呢?  --------------------编程问答-------------------- while(true)
{
    try
  {
  int i = 0;
  i++;
  CheckForIllegalCrossThreadCalls = false;
  dt.Rows.Clear();
  System.Threading.Thread.Sleep(10);
  }
  catch (Exception ex)
  {
  MessageBox.Show(ex.Message);
  }

} --------------------编程问答-------------------- 调试监控 --------------------编程问答--------------------
引用 4 楼 ilove_aspnet 的回复:
引用 1 楼 xiao_p 的回复:
和多线程一点关系都没有
你将你的递归代码弄到一个线程里,一样溢出

递归没有出口,无限循环,当然溢出。。。


不太同意,递归怎么就没有出口了,如果没有的话,那么不用线程 循环调用一样会溢出, 
当然有出口,要不然递归还怎么用,达到条件就是出口了, 至于LZ的问题首先看递归是不是死递归,然后看线程调用, 这个应该没问题,我怀疑是你递归算法有问……


不是递归没有出口,而是楼主的递归代码没有出口。。。
递归当然要有break的条件了,要不谁还用递归啊,那不是谁用谁挂吗。。。 --------------------编程问答--------------------
引用 6 楼 yyl_520 的回复:
那如果不用递归,改用循环。会是相同的结果吧 ,
看了大家的回帖我也明白了饿,这个主要问题是出现在了我的递归上面。
那有没有办法在下一次递归时,释放上一次的堆栈呢?


个人感觉,现在不是对堆栈释放不出去的问题,而是你的递归在无限循环着,也就是说如果堆栈够大的话,你的递归会永远的循环下去。
所以,你要找到一定的条件让你的递归在某个情况下停止掉。

话说递归和循环再语义上确实有相近的地方,很多函数是编程语言里面就没有循环这个东东


楼主现在的代码如果改成循环等同于
while(true)
{
...
}
这样的话,你说多大的堆栈够你用呢? --------------------编程问答-------------------- 呵呵   谢谢 各位 ,问题解决了,就用楼上说的WHILE  --------------------编程问答--------------------
引用 4 楼 ilove_aspnet 的回复:
引用 1 楼 xiao_p 的回复:
和多线程一点关系都没有
你将你的递归代码弄到一个线程里,一样溢出

递归没有出口,无限循环,当然溢出。。。


不太同意,递归怎么就没有出口了,如果没有的话,那么不用线程 循环调用一样会溢出, 
当然有出口,要不然递归还怎么用,达到条件就是出口了, 至于LZ的问题首先看递归是不是死递归,然后看线程调用, 这个应该没问题,我怀疑是你递归算法有问题……


这么明显的问题,哪里有出品,明明,就是一个无限递归。
看都不用看,

以前ASP的堆栈只支持128层的递归,现在的不知道,估计还应该是差不多
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,