写了个程序 里面调用了几个线程
线程执行方法,方法里面重置线程,但是随着程序运行时间内存占用越来越大
代码大概逻辑如下
 
//线程的参数类
public class ThreadPara{
publict int id{get;set;}
publict string  name{get;set;}
//...
}
 public partial class From1Main : Form{
      ThreadPara para = new ThreadPara();
      ThreadPara para2 = new ThreadPara();
       private Thread t1 = null;
        private Thread t2 = null;       private void From1Main_Load(sender ,e){
              para.id=1;//对para赋值...
              para2.id=1;//对para2赋值...
               t1 = new Thread(new ParameterizedThreadStart(fun1));
               t1.Start(para);
                t2= new Thread(new ParameterizedThreadStart(fun2));
                t2.Start(para2);
       }        private void fun1(object para){
               ThreadPara paraArray = para as ThreadPara;
              //dosomething here
              //...................
              //
               Thread.Sleep(100000);
               t1 = new Thread(new ParameterizedThreadStart(fun1));
                t1.Start(paraArray);
      }      private void fun2(object para){
               ThreadPara paraArray = para as ThreadPara;
              //dosomething here
              //...................
              //
               Thread.Sleep(100000);
               t2 = new Thread(new ParameterizedThreadStart(fun2));
               t2.Start(paraArray);
    }
}

解决方案 »

  1.   

    不如用thread.timer
      

  2.   

    线程里开线程,不停的重复吧,
    你应该只开一个线程然后 while(true)循环做你的事情
      

  3.   


    //线程的参数类
    public class ThreadPara{
    publict int id{get;set;}
    publict string  name{get;set;}
    //...
    }
     public partial class From1Main : Form{
          ThreadPara para = new ThreadPara();
          ThreadPara para2 = new ThreadPara();
           private Thread t1 = null;
            private Thread t2 = null;       private void From1Main_Load(sender ,e){
                  para.id=1;//对para赋值...
                  para2.id=1;//对para2赋值...
    whiel(true){
    if(t1==null){
                   t1 = new Thread(new ParameterizedThreadStart(fun1));
                   t1.Start(para);
    }
    if(t2==null){
                    t2= new Thread(new ParameterizedThreadStart(fun2));
                    t2.Start(para2);
    }
    }
           }        private void fun1(object para){
                   ThreadPara paraArray = para as ThreadPara;
                  //dosomething here
                  //...................
                  //
                   Thread.Sleep(100000);
                  t1.Abort();
                   t1 =null;
          }      private void fun2(object para){
                   ThreadPara paraArray = para as ThreadPara;
                  //dosomething here
                  //...................
                  //
                   Thread.Sleep(100000);
                    t2.Abort();
                    t2 =null;
        }
    }那如果改写成这样是不是合理的?
      

  4.   

    在“等待”的时候,没有必要占用宝贵的线程。把你的 Sleep(100000) 删掉,使用定时器即可。你的问题可能需要看你自己的 //dosomething here 的设计才能清楚。你可以自己写一个测试来测试你所怀疑的对象有没有被 GC 释放掉。方法是,可以使用一个“弱引用”对象来引用你要检测的对象,然后当处理方法(所谓的 something)执行完毕之后,定时于10秒钟之后,再来到弱引用对象来查询一下 Target 目标对象是否还“活着”、还不为 null,如果还活着、不为null,那么这个对象或者它的宿主容器就有内存泄漏问题。以测试方式来诊断问题,并且保证你的产品质量。
      

  5.   

    其实通常我们说“是不是合理的”的时候,前提是我们写过测试程序,进行过几十万次测试。如果没有写过测试,没有测试驱动开发,最好不要根据理论来下判断。对于你也是如此。比如说我们最简单的“1+1=?”的程序的时候,我们可能写一个测试var test_20170408_001()
    {
        var a =1;
        var b = 1;
        var c = plus(a,b);
        Debug.Assert(c == 2, "1+1结果应该等于2");
    }先不管什么理论,先学着写一个测试,证明你有能力把 Bug 抛出来。一个真正会编程的人,绝不是只会写 plus 方法的人,而是一个会写出后边那条 Debug.Assert 代码的人。
      

  6.   

    我理解的是 在对线程t1, t2 重新赋值的时候 之前的应该被释放掉吧你想做的事情,好像叫【尾递归】,在 C# 里面应该做不到的。你可以搜索一下关键字。