There are several factors. One of them is referred to as stack memory. Since the stack memory is not processed by the usual GC allocator used for objects, creating a thread stack and then abandoning it is very different from creating mega objects of a heap of objects and their failure.
Another factor not yet mentioned is the costs associated with things such as threaded variables. On some systems that require all the static flow variables that a thread can use to determine before the flow starts, starting a new thread will require initialization of all static variable flows. Because .net allows streams to dynamically add stream variables, the data structures used are different. However, initializing such data structures when starting a stream is not free.
source share