C#事件订阅者排队

时间:2018-10-14 15:02:29

标签: c# events event-handling

如果事件引发的速度快于订阅者消耗的速度,会发生什么? 每次引发事件时,事件处理程序是否在新的“线程”上启动。 还是仅当前一个事件的执行完成时才将事件排队,并调用下一个事件的处理程序?

1 个答案:

答案 0 :(得分:2)

这很容易测试。这是我设置的程序,用于演示发生的情况:

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

您会发现,即使Invoker()试图尽快触发事件,“处理事件”消息也只会每500毫秒输出一次到控制台。

这是因为事件处理程序与调用程序在同一线程上运行。没有排队或启动新线程。调用者根本无法比处理程序处理事件更快地调用事件,因为它们位于同一线程上。