C# Thread.CurrentThread在哪一点进行计算?
在以下代码中:C# Thread.CurrentThread在哪一点进行计算?,c#,multithreading,C#,Multithreading,在以下代码中: ThreadStart ts = new ThreadStart((MethodInvoker)delegate { executingThreads.Add(Thread.CurrentThread); // work done here. executingThreads.Remove(Thread.CurrentThread); }); Thread t
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是从创建线程t的线程计算出来的,因此中止它不会中止生成的线程。中止线程从来都不是一个好主意。如果您100%确信您在线程中执行的任何任务都不会损坏任何其他地方的任何状态信息,那么您可能会侥幸逃脱,但即使在这些情况下,也最好避免这样做。有更好的解决方案,比如让线程停止,给它一个机会来清理它可能留下的任何混乱
无论如何,在回答您的问题时,
Thread.CurrentThread
正在新线程开始执行时调用的方法中执行,因此它将返回新线程,而不是创建新线程的线程(如果有意义)。回答您的问题,并且不对中止线程的明智性发表评论(顺便说一句,我同意之前的评论),Thread.CurrentThread,正如您所写的,它将执行您希望执行的操作-它将表示当前正在调用您的委托的线程,而不是创建和启动线程的线程。首先,我认为中止线程是个坏主意,请检查其他答案/注释以了解原因。但我将把它放在一边r现在
由于您的调用位于委托内部,因此只有当线程执行该委托的内容时,才会对这些调用进行计算。因此,代码按照您预期的方式工作,您得到的是委托执行的线程,而不是创建委托的线程
当然,您的代码不是异常安全的,您可能应该将remove放入finally
子句中
executingThreads
必须是线程安全的集合,否则需要使用锁定
跟踪线程的另一种方法是将创建的线程添加到创建线程的集合中,然后使用该线程的属性检查线程是否已终止。这样,您就不必依赖线程跟踪本身。但这仍然不能解决中止问题。在您的代码中给定,
Thread.CurrentThread
在线程t
的上下文中调用,而不是在其创建者中调用
此外,中止线程在道德上等同于杀死幼犬。你的问题表明了一个根本性的问题;你不应该首先中止线程。如果你不能彻底关闭线程,那么你就不应该启动它。线程中止只能作为最后的手段;你应该使用的最小控制单元异步终止是一个过程。如果线程正在做一些重要的事情,终止线程可能会严重破坏系统的稳定性。中止线程通常是个坏主意。让它们自杀。例如,定期检查
CancellationToken
。@Eric“异步终止的最小控制单元是进程。”我认为强制卸载AppDomains也是相对安全的(但当然也不能保证成功)。至少在.net 2引入关键终结后是这样。是的,但我想这样做。通常"一个坏主意,但在这种情况下它可能没问题。@CodeInChaos:对;我想应该说,可以可靠地终止的最小控制单元是进程。如果可以的话,我会给你+2。对于puppies部分:p更认真,而不是中止。你应该礼貌地请求线程取消,然后等待线程响应nds在它的便利性。很好的计划。我这样做,所以我基本上一次运行一个线程,但最新的线程被称为第一。