You can use any collection to get a list of your running threads.
For simplicity here I used a string. But you could use a list of your own objects.
string RunningThreads = string.Empty;
object LockObject = new Object();
Parallel.ForEach("ABCDEFGHIJKLMNOP", (c, i) =>
{
lock (LockObject)
{
RunningThreads += c.ToString();
System.Console.WriteLine("Starting thread " + c+ ". Running threads: " + RunningThreads);
}
Thread.Sleep(1000);
lock (LockObject)
{
RunningThreads = RunningThreads.Replace(c.ToString(), "");
System.Console.WriteLine("Ending thread " + c + ". Running threads: " + RunningThreads);
}
});
System.Console.WriteLine("The End");
System.Console.WriteLine("Running threads: " + RunningThreads + " (should be empty)");
Output
Starting thread A. Running threads: A
Starting thread B. Running threads: AB
Starting thread C. Running threads: ABC
Starting thread D. Running threads: ABCD
Starting thread E. Running threads: ABCDE
Ending thread A. Running threads: BCDE
Starting thread F. Running threads: BCDEF
Ending thread B. Running threads: CDEF
Starting thread G. Running threads: CDEFG
Ending thread C. Running threads: DEFG
Starting thread H. Running threads: DEFGH
Ending thread D. Running threads: EFGH
Starting thread I. Running threads: EFGHI
Ending thread E. Running threads: FGHI
Starting thread J. Running threads: FGHIJ
Starting thread K. Running threads: FGHIJK
Ending thread F. Running threads: GHIJK
Starting thread L. Running threads: GHIJKL
Ending thread G. Running threads: HIJKL
Ending thread H. Running threads: IJKL
Starting thread N. Running threads: IJKLN
Starting thread M. Running threads: IJKLNM
Ending thread I. Running threads: JKLNM
Starting thread O. Running threads: JKLNMO
Ending thread J. Running threads: KLNMO
Starting thread P. Running threads: KLNMOP
Ending thread K. Running threads: LNMOP
Ending thread L. Running threads: NMOP
Ending thread N. Running threads: MOP
Ending thread M. Running threads: OP
Ending thread P. Running threads: O
Ending thread O. Running threads:
The End
Running threads: (should be empty)