I'd guess that the Main loop is spinning, preventing the event from firing. Add a Thread.Sleep(10) in your Main while (true) loop to give the event queue a little breathing room.
The .NET event is similar to the Arduino interrupt, the big difference is the event is queued and processed in the same thread as the event source and interrupts are much more immediate. Since the _port is running in the main thread, the light loop in Main isn't yielding to let the event fire.