What's your goal?
If you want to measure execution times and counts of routines, I guess you need a profiler.
If you want to find performance problems, so you can fix them, that is a different problem.
I'm only asking because somehow the idea got popular that they are the same.
For the latter goal, people who have tried it understand that studying a few random-time samples of the call stack of the threads is a very effective way to find performance problems.
I know Java allows you to stop all threads at the same time and dump their call stacks. I would think the .net development environment would allow the same thing.
If not, just run it under the IDE and halt one thread at a time, to see if it is wasting any cycles. If it is, you just fix it. Repeat until you don't find anything.
If you do this for all threads, then at least you know that any slowness is not due to slowness in any given thread. You could still have a problem of unnecessary message traffic. That's a little more tricky to diagnose.