我在一个服务里,每一小时即启动一个线程执行操作
DailyCtrl daily = new DailyCtrl(now);
ThreadStart start = new ThreadStart(daily.Run);
Thread thread = new Thread(start);
thread.Priority = ThreadPriority.BelowNormal;
thread.Start();
在daily.Run()方法执行完之后,是否自动能释放此线程?还是线程一直存在需要我来释放?

解决方案 »

  1.   

    在daily.Run()方法执行完之后,是否自动能释放此线程
    是。线程是否需要释放
    不用。
      

  2.   

    看你的Run里是否有while语句了,如果只是一个方法,执行完就不会循环,线程会自动结束,然后会被垃圾回收器回收释放
      

  3.   

    我觉得作为安全的代码,特别是在WINFORM程序中,有必要释放新建的线程,
    WINFORM多数是单线程单元模型
    当你 new Thread时系统自然会开启新的资源,尽管daily.Run()会在执行完后垃圾回收,
    但是你想在一个button_click事件里:DailyCtrl daily = new DailyCtrl(now); 
    ThreadStart start = new ThreadStart(daily.Run); 
    Thread thread = new Thread(start); 
    thread.Priority = ThreadPriority.BelowNormal; 
    thread.Start(); 这段代码被用户不断点了一百次,你能保证它会是执行完了就立即回收了吗
    垃圾回收机制好像不是这样你试下daily.Run完成后,显示的调用Dispose()和不调用的区别,看看任务管理器的状态就知道了如果你run中有循环、使用了套接字,Timer等,请一定要,至少是程序退出时,将线程赋空
      

  4.   


    1、态度没有错。但要如何"释放新建的线程"?
      线程返回后就结束了。虽然指向它的引用还存在(内核对象也还存在),但它们只保留一些用于统计的信息,开销不大。
      而其他‘昂贵’的资源如线程栈等都已经释放了。用GC.Collect是人为干扰垃圾回收,很多情况下会降低运行效率。
    2、Thread并没有实现IDisposable,不能用Dispose模式。
    3、前半句,对。但这不是线程独有的问题,其他地方也应如此。
      后半句,除了"请一定要",也对。程序退出后,它占的系统资源部分会自动被回收。不过程序退出前显式关闭占用资源是个好习惯。