最近写了一段小代码 ,想了解线程的应用,但是发现递归和线程用到一起就会出现堆栈溢出的问题 。不知道怎么解决,请教高手帮忙
下面是我的实例代码
 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.   


    同意楼上说的,在一个程序中,这些独立运行的程序片断叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。多线程处理一个常见的例子就是用户界面。利用线程,用户可按下一个按钮,然后程序会立即作出响应,而不是让用户等待程序完成了当前任务以后才开始响应。
      

  2.   

    while(true)
    {
        try
      {
      int i = 0;
      i++;
      CheckForIllegalCrossThreadCalls = false;
      dt.Rows.Clear();
      System.Threading.Thread.Sleep(10);
      }
      catch (Exception ex)
      {
      MessageBox.Show(ex.Message);
      }}
      

  3.   


    不是递归没有出口,而是楼主的递归代码没有出口
    递归当然要有break的条件了,要不谁还用递归啊,那不是谁用谁挂吗
      

  4.   


    个人感觉,现在不是对堆栈释放不出去的问题,而是你的递归在无限循环着,也就是说如果堆栈够大的话,你的递归会永远的循环下去。
    所以,你要找到一定的条件让你的递归在某个情况下停止掉。话说递归和循环再语义上确实有相近的地方,很多函数是编程语言里面就没有循环这个东东
    楼主现在的代码如果改成循环等同于
    while(true)
    {
    ...
    }
    这样的话,你说多大的堆栈够你用呢?
      

  5.   

    呵呵   谢谢 各位 ,问题解决了,就用楼上说的WHILE 
      

  6.   


    这么明显的问题,哪里有出品,明明,就是一个无限递归。
    看都不用看,以前ASP的堆栈只支持128层的递归,现在的不知道,估计还应该是差不多