从内部对象方法获取线程名称

时间:2012-04-30 03:24:29

标签: c# multithreading

我知道我可以通过调用Thread.CurrentThread.Name

来获取线程名称

但我遇到了一个棘手的情况。

我创建了两个线程,每个线程都启动一个新对象(表示objA)并运行一个方法。

在对象(objA)方法(objAM)中,我创建另一个对象(表示objB)并运行一个方法(objBM)。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;


namespace ConsoleApplication1
{
    class Program
    {

        static void Main(string[] args)
        {
            TESTA a = new TESTA();
        }

    }

    class TESTA
    {
        private Thread t;

        public TESTA()
        {
            t = new Thread(StartThread);
            t.Name = "ABC";
            t.IsBackground = true;
            t.Start();

            t = new Thread(StartThread);
            t.Name = "XYZ";
            t.IsBackground = true;
            t.Start();

        }

        private void StartThread()
        {
            objA thisA = new objA();
        }
    }

    class objA
    {
        private System.Threading.Timer t1;

        public objA()
        {
            objAM();
            t1 = new Timer(new TimerCallback(testthread), null, 0, 1000);
        }

        private void objAM()
        {
            Console.WriteLine("ObjA:" + Thread.CurrentThread.Name);
        }

        private void testthread(object obj)
        {
            objB thisB = new objB();
        }
    }

    class objB
    {
        public objB()
        {
            objBM();
        }

        private void objBM()
        {
            Console.WriteLine("ObjB:" + Thread.CurrentThread.Name);
        }
    }
}

但是objB中Thread.CurrentThread.Name的值返回空。

如何在objBM中获取线程名称?

1 个答案:

答案 0 :(得分:2)

System.Threading.Timer的描述:该方法不在创建计时器的线程上执行;它在系统提供的ThreadPool线程上执行。

因此,您的testthread方法在未命名的ThreadPool线程上执行。顺便说一句,你可以通过拨打Thread.CurrentThread.IsThreadPoolThread验证它。