One for the program, and one for garbage collection.
According to the
Microsoft documentation[
^].,
"The thread pool is created the first time you create an instance of the ThreadPool class. The thread pool has a default limit of 25 threads per available processor, which could be changed using CorSetMaxThreads as defined in the mscoree.h file. Each thread uses the default stack size and runs at the default priority. Each process can have only one operating system thread pool."
The CLR may create extra threads for the thread pool just in case you need them, but your code won't run on them unless you explicitly make it happen.
You can see threads being created if you watch the Output panel in Visual Studio while your app is running.