Очередь подписчиков на события C # - PullRequest
0 голосов
/ 14 октября 2018

Что произойдет, если событие возникает быстрее, чем оно используется подписчиком?Запускается ли обработчик событий в новом «потоке» при каждом возникновении события.Или события ставятся в очередь, и обработчик следующего события вызывается только тогда, когда завершается выполнение обработчика предыдущего события?

1 Ответ

0 голосов
/ 14 октября 2018

Это довольно легко проверить.Вот программа, которую я настроил, чтобы показать, что происходит:

class Program
{
    static void Main(string[] args)
    {
        Invoker invoker = new Invoker();
        Consumer consumer = new Consumer(invoker);
        invoker.RunEvents();
    }
}

class Invoker
{
    public delegate void SomeEventHandler();

    public event SomeEventHandler SomeEvent;

    public void RunEvents()
    {
        while (true)
            SomeEvent.Invoke();
    }
}

class Consumer
{
    public Consumer(Invoker invoker)
    {
        invoker.SomeEvent += HandleSomeEvent;
    }

    private void HandleSomeEvent()
    {
        Console.WriteLine("Handling event");
        Thread.Sleep(500);
    }
}

Вы увидите, что сообщение «Обработка события» выводится на консоль только один раз каждые 500 мс, даже если Invoker () пытаетсявызвать событие как можно быстрее.

Это потому, что обработчик событий работает в том же потоке, что и invoker.Там нет очереди или начать новую тему.Вызывающий просто не может вызвать событие быстрее, чем обработчик обрабатывает событие, потому что они находятся в одном потоке.

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