この質問は、スタックとスタックフレームに関する多くの誤解の可能性を示していると告白します。うまくいけば、私はここで適切な質問をしています。
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();
}