Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get the reference of TPL task's thread in C#?

When I create a task as

Task task = Task.Factory.StartNew(() => someMethod(args));

in C# 4.0+, how can I get the reference of the thread(s) of this task?

Is it possible that the task is executed in the same thread that created the task or spawn more than one thread?

Update:
The reasons are:

  • I'd like to identify the task's thread in debugger (and attribute a name for it), etc.

Is created task executed always in separate thread from the one in which a task was created?
Is it one, zero or more than one thread?
Is it executed on a single and the same core?
It is important to know since, for example, I can put to sleep the main thread thinking that I am freezing the background worker

Update:
Useful answer:

  • Specifying a Thread's Name when using Task.StartNew
like image 886
Fulproof Avatar asked Mar 11 '13 14:03

Fulproof


3 Answers

Is created task executed always in separate thread from the one in which a task was created?

No, there are certain situations in which the TPL is able to determine that the task can be executed on the same thread that created it, either because the relevant task creation option (or task scheduler) was supplied, or as an optimization because the calling thread would otherwise not have anything to do. You don't really need to worry about this though; it's not like you're going to end up blocking the UI thread because the TPL choose to execute it's code in that context. That won't happen unless you specifically indicate that it should. For all intents and purposes you can assume that this never happens (unless you force it to happen) but behind the scenes, without you ever needing to realize it, yes, it can happen.

Is it one, zero or more than one thread?

By default, tasks are executed in the thread pool. The thread pool will vary in the number of threads it contains based on the workload it's given. It will start out at one, but grow if there is sufficient need, and shrink if that need disappears. If you specify the LongRunning option, a new thread will be created just for that Task. If you specify a custom TaskScheduler, you can have it do whatever you want it to.

Is it executed on a single and the same core?

Potentially, but not assuredly.

It is important to know since, for example, I can put to sleep the main thread thinking that I am freezing the background worker

Putting the main thread to sleep will not prevent background workers from working. That's the whole point of creating the background workers, the two tasks don't stop each other from doing work. Note that if the background workers ever try to access the UI either to report progress or display results, and the UI is blocked, then they will be waiting for the UI thread to be free at that point.

like image 142
Servy Avatar answered Sep 25 '22 01:09

Servy


You can use:

System.Threading.Thread.CurrentThread

But as said in the comments, you use the TPL to abstract threading away, so going back to this "low level" is a likely indicator of poor design.

like image 28
Louis Kottmann Avatar answered Sep 24 '22 01:09

Louis Kottmann


Task.Factory.StartNew() queues the task for execution (see here). The actual thread that executes the task and when it gets executed is up to the TaskScheduler specified (the current TaskScheduler is used if none is specified).

In .Net 4 the default TaskScheduler uses the ThreadPool to execute tasks (see here) so if a ThreadPool Thread queued the task the same thread can possibly execute it later on.

The number of threads is dictated by the ThreadPool.

You shouldn't really care about which core your tasks are executed on.

Queuing a Task for execution will most likely schedule it to be executed on a ThreadPool Thread so you won't be at risk of accidentally putting the main thread to sleep

like image 32
HasaniH Avatar answered Sep 26 '22 01:09

HasaniH