views:

1030

answers:

4

Suppose I start two threads like this:

            // Start first thread
            Thread loaderThread1 = new Thread(loader.Load);
            loaderThread1.Name = "Rope";
            loaderThread1.Start();

            // Start second thread
            Thread loaderThread2 = new Thread(loader.Load);
            loaderThread2.Name = "String";
            loaderThread2.Start();

Is there any way I can enumerate the threads by using their Name property?

I want to be ablie to check if a thread with a specific name is still running.

Each thread I create works with a named set of data, the name of the data set is used as the name for the thread working with the data. Before starting a worker thread I want to see if any previous thread for the same set of data is already running.

The threads I get when using System.Diagnostics.GetCurrentProcess().Threads are of type ProcessThreads, not Threads!

+1  A: 

I suspect you might have to put the threads into a Dictionary<string,Thread> for that to work - but why do you want it anyway? There are usually other ways of communicating between threads (any of the lock / wait objects).

To work at the process level (i.e. not thinking of the Thread object), see here - you could limit it to the current process, but you won't be able to interact with the thread.

Marc Gravell
This is exactly what I do now and it works fine. I was hoping there would be a better(?) way of doing it!
Petteri
Do not know why it should be usefull to have a dictionary, if he wishes just Enumeration, but thats not the point ;-).It is usefull to get an overview of what is going on, to monitor the thrading-scaling of the app. Not for communicating between threads.
BeowulfOF
A: 

Note also that thread names are not required to be unique. Seems like using the thread ID might be a better option...

HTH, Kent

Kent Boogaart
ManagedThreadId would be even better...
Marc Gravell
A: 

So, after my mistake with the process threads, here a way how to hold your Threads. Nothing spectacular, but I think coding examples are very handy anytime.

List<Thread> threads = new List<Thread>();

for (int i = 0; i < 10; i++)
{

    Thread t = new Thread(delegate()
        {
     do
     {
         Thread.Sleep(50);
     } while (true);
        });

    t.IsBackground = true;
    t.Name = i.ToString();
    t.Start();
    threads.Add(t);
}

foreach (Thread t in threads)
{
    Console.WriteLine(t.Name);
}
BeowulfOF
If I understand your code correctly, the code will store each thread in a list, pretty much like Marc Gravell suggested. I store the threads in a Dictionary<string, Thread>.
Petteri
Yes, if it has any benefit, that you use a dictionary, use it. But for my democode a list was correct.
BeowulfOF
A: 

I think you want the following

System.Diagnostics.Process.GetCurrentProcess().Threads

Michael Prewecki
Combined with some kind of search (foreach, LINQ statements?) on the resulting collection to get the Thread with the name you want. Beware that Thread names need not be unique, as other replies have mentioned.
peSHIr
Sorry, but did the same mistake, that collection return not Threads but ProcessThreads, so not the ones, he starts in his code.
BeowulfOF