如果事件引发的速度快于订阅者消耗的速度,会发生什么? 每次引发事件时,事件处理程序是否在新的“线程”上启动。 还是仅当前一个事件的执行完成时才将事件排队,并调用下一个事件的处理程序?
答案 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毫秒输出一次到控制台。
这是因为事件处理程序与调用程序在同一线程上运行。没有排队或启动新线程。调用者根本无法比处理程序处理事件更快地调用事件,因为它们位于同一线程上。