Порядок старшинства с методами? - PullRequest
3 голосов
/ 20 февраля 2009

Скажите, у меня есть 2 метода. Одним из них является метод, вызванный изменением выбранного индекса в списке. Второй метод помогает очистить все текстовые поля, установить индекс списка в -1 и установить фокус.

Вопрос:

Выполняется второй метод, во время кода он изменяет выбранный индекс списка на -1, тем самым отключая триггер события для 1-го метода. Останавливает ли метод 2 свое собственное выполнение и переносит ли процесс в событие, а затем возвращается к своей работе после завершения метода 1 ... ИЛИ завершает ли метод 2 весь свой кодовый блок, а затем переводится в метод 1 после изменения выбранного индекса?

Ответы [ 5 ]

8 голосов
/ 20 февраля 2009

Первый случай.

Давайте ненадолго оставим нити в стороне, особенно потому что они не участвуют в вашем сценарии.

Вы говорите о свойствах и методах, но под всем этим все просто функции. Когда одна функция вызывает другую, управление в вашей программе переходит к вызываемой функции. Когда эта функция завершает работу, элемент управления возвращает к точке, где она была вызвана. Ваша программа автоматически запоминает, куда ей нужно вернуться, независимо от того, насколько глубоко функции вызывают больше функций. *

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

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

Вы можете доказать себе, что ваше первое предложение - как оно работает. Отобразите окно сообщения в первом методе и отобразите другое окно сообщения после точки во втором методе, где вы устанавливаете свойство индекса. (Используйте разные сообщения!) Вы должны увидеть появление первого сообщения, а после закрытия окна сообщения вы увидите появление второго сообщения, показывающего, что второй метод не продолжал выполняться, пока выполнялось первое.

* Там - это предел, но он редко срабатывает, если в вашей программе нет ошибки. Когда у вас слишком много вызовов вложенных функций, происходит переполнение стека .

1 голос
/ 20 февраля 2009

Если нет многопоточной ситуации, событие сработает до завершения выполнения метода. Если вы хотите увидеть это, напишите то, что вы предложили на языке .NET, и изучите полученный Il. Вы можете сделать это с помощью ILDASM или Reflector, или даже создать свое собственное приложение для переотражения. Вы должны понимать синтаксис IL достаточно, чтобы увидеть ветку, но это не так сложно, если вы понимаете концепции программирования.

Роб назвал этот "синтаксический сахар", с чем я несколько согласен. Это действительно трюк с компилятором, но я думаю, он подпадает под метку «синтаксический сахар», как это обычно используется.

1 голос
/ 20 февраля 2009

Существует третья альтернатива, которую вы можете изучить: они также могут одновременно запускать ! Если я правильно понимаю ваш вопрос, метод 2 будет вызван событием изменения индекса. В приложении C # Windows Forms это другое событие будет происходить в отдельном потоке выполнения.

Концепции для изучения: многопоточность.

Надеюсь, это даст вам отправную точку в ваших исследованиях знаний.

0 голосов
/ 20 февраля 2009

Я сам начинающий, может быть, я могу помочь. Method2 сработает, затем, когда выбор изменится, Method1 сделает свое дело, затем Method2 продолжит работу.

Если вы не хотите, чтобы Method1 запускался в это время, вы можете захотеть сделать что-то вроде: (ДЕЙСТВИТЕЛЬНО псевдокод)

Method2(object sender, System.EventArgs e)
{
  //Unsubscribe Method1 from ListboxEvent
  Listbox.OnSelectionChange -= Method1;

  ... Stuff Method2 actually does ...

  Manualy call Method1 if you want it to fire

  //Subscribe Method1 from ListboxEvent
  Listbox.OnSelectionChange += Method1;
}

Это, вероятно, не оптимально (и, возможно, некоторые лучшие практики ...), но из-за отсутствия лучшего объяснения, по крайней мере, у вас есть немного информации, чтобы помочь вам в поиске. Надеюсь, это поможет!

0 голосов
/ 20 февраля 2009

Я предполагаю, что речь идет о c #, и поэтому у вас есть язык, который поддерживает несколько потоков. Если вы не хотите беспокоиться о потоках (что было бы плохой идеей, если учесть взаимодействие с пользователем), вы можете запустить свой графический интерфейс в одном потоке и вести себя одинаково, если компоненты не создают свои собственные потоки (что было бы немного странно, хотя). Если вы хотите добиться асинхронного (параллельного) выполнения события, вам нужно, чтобы событие запускалось в его собственном потоке.

Чтобы ответить на ваш вопрос: если вы не используете несколько потоков, метод, вызванный событием, будет поставлен в очередь. Это именно то, что происходит, когда вы видите, что GUI медленно реагирует в некоторых программах.

Надеюсь, что все прояснилось и добро пожаловать от другого новичка:)

...