C# Куда приходит выполнение после обработки события? - PullRequest
0 голосов
/ 01 апреля 2020

Считайте, что у меня есть "Форма", и она содержит кнопку. Я начал процесс компиляции (Ctrl + F5). Когда я нажимаю кнопку, происходит событие и выполняется обработчик события. Куда возвращается выполнение после обработки события?

 public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        //some Code
    }
}

Ответы [ 3 ]

2 голосов
/ 01 апреля 2020

Краткий ответ: Возвращается к прослушиванию большего количества событий.

Подробный ответ:

Под капотом все в Windows работает поверх Win32 API. Win32 API имеет как минимум 2 функции, которые запускаются всеми программами. Оконная процедура одна, и именно здесь обрабатываются наши сообщения о событиях. Другое называется сообщением l oop и выглядит примерно так:

while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
    TranslateMessage(&Msg);
    DispatchMessage(&Msg);
}
return Msg.wParam;

Сообщение l oop является сердцем всех основанных на событиях Windows программ. GetMessage() получает сообщение из очереди сообщений вашего приложения. Каждый раз, когда пользователь перемещает мышь, печатает на клавиатуре, щелкает меню вашего окна или выполняет любые другие действия, сообщения генерируются системой и заносятся в очередь сообщений вашей программы. Позвонив по номеру GetMessage(), вы запрашиваете удаление следующего доступного сообщения из очереди и возвращение его для обработки.

TranslateMessage() выполняет дополнительную обработку событий клавиатуры. Наконец DispatchMessage() отправляет сообщение в окно, в которое оно было отправлено.

1 голос
/ 01 апреля 2020

Проверьте Обзор событий для Windows Формы

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

Таким образом, сам элемент управления вызывает делегат. Код контроля поднял метод. Поэтому, когда вы щелкаете по элементу управления, в элементе управления появляется некоторый код, который вызывает предоставленный вами делегат.

Код обычно вызывает делегат, как и любая другая функция, и непрерывно выполняет поток кода:

ie

// do something
deletat(...);
// continue doing something

Еще лучший пример можно найти здесь: Общие сведения о событиях и обработчиках событий в C#

о том, как вызываются делегаты.

1 голос
/ 01 апреля 2020

В каждом приложении winforms есть «скрытое» главное сообщение l oop. Главное сообщение l oop в основном while(true) ... l oop и проверяет входные (и некоторые другие) события, такие как Click, KeyDown, et c ...

Этот основной l oop выполняется внутри Application.Run(...) это вызов. Возможно, в вашем Program.cs файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...