我们都知道像 Task.Run 或者 Parallel.ForEach 这样的方法。
它们每个都会创建任务,在单独的线程或线程池中运行。但是,它们的堆栈在哪里呢?它们是在某个代的堆中还是有专门的地方?
例如,我可以创建1000个任务,它们的堆栈在哪里?如果我调用 GC.Collect(),它们的物理地址是否会移动?
例如,我可以创建1000个任务,它们的堆栈在哪里?如果我调用 GC.Collect(),它们的物理地址是否会移动?
TaskScheduler
执行,它们在TaskScheduler
使用的堆栈上运行。默认调度程序使用线程池线程,这些线程(大多数情况下)是普通的.NET线程。Task.Run
创建这样一个基于默认调度程序的任务。TaskCompletionSource
的任务不执行代码,也不需要堆栈。它们是基于某些外部条件完成的,例如IO完成或计时器滴答声。
stack
,其中一半是名为Stack
的示例类)。 - Damien_The_Unbeliever