Вопрос

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

Вопрос:

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

Это было полезно?

Решение

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

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

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

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

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

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

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

Другие советы

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

Концепции для изучения:нарезание резьбы.

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

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

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

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

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

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

Я сам новичок, может быть, я смогу помочь.Метод2 сработал бы, затем, когда выбор изменился, Метод1 сделал бы свое дело, затем Метод2 продолжил бы.

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

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;
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top