Первый случай.
Давайте ненадолго оставим нити в стороне, особенно потому что они не участвуют в вашем сценарии.
Вы говорите о свойствах и методах, но под всем этим все просто функции. Когда одна функция вызывает другую, управление в вашей программе переходит к вызываемой функции. Когда эта функция завершает работу, элемент управления возвращает к точке, где она была вызвана. Ваша программа автоматически запоминает, куда ей нужно вернуться, независимо от того, насколько глубоко функции вызывают больше функций. *
Когда ваша вторая функция устанавливает индекс, в действительности происходит то, что компилятор преобразует операцию набора свойств в вызов функции. (В конечном счете, свойства являются просто «синтаксическим сахаром» для функций.) Эта функция вызывает множество других функций, которые не важны для сценария, за исключением того, что одна из них вызывает функцию-обработчик события «индекс изменен». Он видит, что у вас есть метод, связанный с этим событием, и вызывает ваш первый метод.
Ваш первый метод запускается, и когда он заканчивается, он возвращается к функции «invoke index-обработчик события». В конце концов, эта и все другие неважные функции завершают работу (возможно, после последовательного выполнения большего количества вызовов функций), и функция «установить свойство индекса» возвращает управление вашему второму методу.
Вы можете доказать себе, что ваше первое предложение - как оно работает. Отобразите окно сообщения в первом методе и отобразите другое окно сообщения после точки во втором методе, где вы устанавливаете свойство индекса. (Используйте разные сообщения!) Вы должны увидеть появление первого сообщения, а после закрытия окна сообщения вы увидите появление второго сообщения, показывающего, что второй метод не продолжал выполняться, пока выполнялось первое.
*
Там - это предел, но он редко срабатывает, если в вашей программе нет ошибки. Когда у вас слишком много вызовов вложенных функций, происходит переполнение стека .