在什么时候评估Thread.CurrentThread?

时间:2011-06-01 18:22:15

标签: c# multithreading

在以下代码中:

ThreadStart ts = new ThreadStart((MethodInvoker)delegate
        {
            executingThreads.Add(Thread.CurrentThread);
            // work done here.
            executingThreads.Remove(Thread.CurrentThread);
        });
        Thread t = new Thread(ts);
        t.Start();

也许你可以看到我想跟踪我开始的线程,所以我可以在必要时中止它们。

但我担心Thread.CurrentThread是从创建Thread t的线程计算的,因此中止它不会中止生成的线程。

4 个答案:

答案 0 :(得分:6)

中止线程永远不是一个好主意。如果你100%肯定你在线程中执行的任何任务都不会在其他地方破坏任何状态信息,那么你可能会侥幸逃脱它,但最好避免在这些情况下这样做。有更好的解决方案,比如标记要停止的线程,让它有机会清理它可能留下的任何混乱。

无论如何,回答你的问题,Thread.CurrentThread正在新线程开始执行时调用的方法中执行,因此它将返回新线程,而不是创建新线程的线程(如果这有意义)

答案 1 :(得分:6)

在您提供的代码中,Thread.CurrentThread在线程t的上下文中调用,而不是其创建者。

此外,中止线程在道德上等同于杀死小狗。

答案 2 :(得分:4)

回答你的问题,并且没有评论中止线程的智慧(顺便说一下,我同意以前的评论者),正如你所写的那样,Thread.CurrentThread会做你期望做的事情 - 它会表示当前正在调用您的委托的线程,而不是创建和启动该线程的线程。

答案 3 :(得分:3)

首先,我认为中止线程是一个坏主意,检查其他答案/评论是出于什么原因。但是我现在暂时把它放在一边。

由于您的调用位于委托中,因此只有在线程执行该委托的内容后才会对其进行评估。所以代码按照你期望它的工作方式工作,你得到委托执行的线程,而不是创建委托的线程。

当然,您的代码不是异常安全的,您应该将remove放入finally子句中。

executingThreads必须是线程安全集合,或者您需要使用锁定。

跟踪线程的另一种方法是将创建的线程添加到创建线程的集合中,然后使用该线程的属性来检查线程是否已经终止。这样你就不必依赖线程保持跟踪本身。但这仍然无法解决堕胎问题。