Я думаю, что вы говорите, что вы ожидаете, что var1
будет освобождено , когда TestMethod()
выйдет.В конце концов, локальные переменные хранятся в стеке, и когда метод завершается, указатель стека должен возвращаться в то место, где он был до вызова, что означает, что все локальные переменные освобождены.Если бы это было действительно то, что происходило, var1
не мог бы быть установлен в ноль вообще;он может содержать мусор или биты какой-то другой локальной переменной, созданной позже, когда указатель стека снова перемещается.Это то, что вы имеете в виду?
Для меня загорелся тот факт, что асинхронное мышление вообще не основано на стеке.Стек просто не работает - потому что порядок вызовов не образует стек.Вместо этого биты кода связаны с контекстными объектами, которые хранятся в куче 1009 *.Они могут выполняться в любом порядке и даже одновременно.
Вашему делегату требуется var1
, поэтому компилятор переводит его из переменной, хранящейся в стеке, в переменную, хранящуюся в одном из этих объектов, связанных с поведением делегата.Это то, что называется «закрытием» или «закрытой переменной».Для делегата это выглядит как локальная переменная, потому что она просто больше не находится в стеке.Он будет жить так долго, как этот объект должен жить, даже после выхода TestMethod()
.