我承认这个问题显示了很多关于堆栈和堆栈帧的可能误解。希望我在这里问一个正确的问题。
在 C# 中,堆栈帧和局部变量如何处理如下代码。这些案例的有趣之处在于,StartTasks 中的变量 j 和 StartTasks2 中的变量 i 都被任务使用,这些任务很可能在这些变量不再在范围内并且在它们运行的堆栈帧之后通常会从堆。
此外,在什么情况下,像 j 这样不断被“重新创建”的局部变量在超出范围后会获得一个全新的内存插槽,就像在 StartTask 中发生的那样,并且该局部变量在哪里存在(即 StartTasks 的堆栈帧,这意味着框架不能被删除,或其他地方)?
void StartTasks() {
int i = 0;
while ( i < 10000 ) {
int j = i;
Task.Run( () => ExecuteThis( j ) ); // eac
}
}
void StartTasks2() {
int i = 0;
while ( i < 10000 ) {
Task.Run( () => ExecuteThis( i ) ); // eac
}
}
void BigBoss() {
StartTasks();
StartTasks2();
NowMakeMoreCalls();
}