代码之家  ›  专栏  ›  技术社区  ›  jerryjvl

.NET框架线程“祖先”

  •  1
  • jerryjvl  · 技术社区  · 16 年前

    我正在寻找一种方法来确定它最初是在哪个线程上生成的。我不知道是否存在这样做的机制,类似于.NET 4新任务并行库中任务的“父”属性。

    编辑: 进一步的调查实际上似乎表明,没有存储这些信息的位置,因此,除了真正丑陋的黑客,这似乎不可能透明地实现。

    因此,我认为我将接受下面的示例代码作为解决问题的最可行(非透明)的答案,即使我必须自己寻找替代设计。谢谢:)

    2 回复  |  直到 16 年前
        1
  •  2
  •   Mehrdad Afshari    16 年前

    系统内部不提供此类功能。您可以很容易地将父线程的线程ID传递给线程启动函数:

    static class ThreadSpawner
    {
        [ThreadStatic]
        private static int parentThreadId;
        public static int ParentThreadId
        {
            get { return parentThreadId; }
        }
    
        private class ThreadInfo
        {
            public int ParentId;
            public Action Method;
        }
    
        private static void StartThread(object parameter)
        {
            var threadInfo = (ThreadInfo)parameter;
            parentThreadId = threadInfo.ParentId;
            threadInfo.Method();
        }
    
        public static void Spawn(Action start)
        {
            new Thread(StartThread).Start(
                new ThreadInfo { 
                     Method = start, 
                     ParentId = Thread.CurrentThread.ManagedThreadId 
                });
        }
    }
    
    
    // Usage:
    ThreadSpawner.Spawn(MyMethod);
    
    static void MyMethod() { 
        Console.WriteLine(ThreadSpawner.ParentThreadId);
    }
    
        2
  •  2
  •   Joshua    16 年前

    更糟糕的是,创建一个.NET线程并不能保证获得一个本机线程,因此您也不能依赖于能够使用p/invoke遍历线程父级信息。

    我知道如果编写测试代码,您将看到本机线程,但不需要生成它,而且在某些情况下,很难猜到它不会。

    编辑:无论如何都无法通过p/invoke获取线程父级。

    推荐文章