【问题标题】:C# End of thread life cycle.C# 线程生命周期结束。
【发布时间】:2016-08-31 08:38:54
【问题描述】:

我有几个线程,都对几个文件进行文件操作(附加)。每个线程写入一个文件,从 ConcurrentQueue 中获取数据。带有条件 !queue.empty 的 while 循环确保队列被完全处理。

当达到循环的结束条件时线程会发生什么,例如委托方法“返回”。只要程序正在运行,它们是否达到某种状态,通知垃圾收集器收集对象,或者它们在内存中保持活动状态,因此我需要手动杀死它们?

我目前没有对线程对象的任何引用,因为我的假设是线程完成,线程被收集。

有没有办法显示当前有多少线程处于活动状态?

【问题讨论】:

    标签: c# .net multithreading garbage-collection


    【解决方案1】:

    检查应用程序中运行的线程数

    Task Manager => Details => Right Click => Select Column => Threads 并检查包含您的 exe 的行

    这些可能包括 GC 线程、终结器线程和其他(如果附加了 VS 调试线程)

    完成后你不需要自己杀死线程。但是,您可以使用IsAlive 属性检查线程是否已完成其工作。

    【讨论】:

    • @MrinalKamboj - 你的评论听起来像俳句诗,对我来说没有意义。你认为你可以重写吗?
    • @MrinalKamboj 我刚才在那个问题更新中更明确地表达了这个声明。
    • @user3185569 - 你从哪里得到“线程对象可能在线程工作完成之前被收集”的想法?
    • @Enigmativity 我认为标记为垃圾收集是我的意图。如果变量超出范围且未在任何地方引用,则将其标记为 GC。
    • @user3185569 - 线程总是至少有一个引用 (Thread.CurrentThread),因此它们永远不会被提前 GC。
    【解决方案2】:

    当当前函数(以及递归调用当前函数的整个调用树)终止时,线程终止。

    例如

    void main()
    { 
       Thread thread = new Thread(f);
    }
    
    void f()
    {
       // allocate suff here  
       g();
    }
    
    void g()
    {
       // allocate stuff here also
    }
    

    线程 threadf() 完成时完成。在 fg 中分配的对象是不可访问的(如果它们仅对这些函数是本地的)并且将在 CLR 需要时进行 GC。

    【讨论】:

    • 您说得对,但您说的方式令人困惑。我最初以为您的意思是线程不会终止,直到调用线程终止。我必须多次阅读您的答案才能清楚地理解它。也许您可以重新措辞以使其更清晰?
    • 因此操作系统中的空闲任务,因此程序不会终止。我开始记起来了。
    猜你喜欢
    • 2017-06-28
    • 2011-04-11
    • 2022-06-12
    • 2016-09-01
    • 2022-01-21
    • 1970-01-01
    • 2021-08-10
    • 2013-08-22
    • 1970-01-01
    相关资源
    最近更新 更多