I personally have not used C#. I really have no idea whether it can be used to receive data fast enough. But I'm going to go out on a limb with comments about the code in msg #3.... but please understand my comments are about communication in general based mostly on experience with C and C++ using native WIN32 API.
Your C# code looks like it's using some sort of callback which C# provides. Maybe? I see you have something called SafeSerialPort with syntax that kinda looks like it's built on top of SafeSerial, which a
google search turned up on Mircosoft's website. But I don't see any mention of callbacks or OnReceive.
Guessing and troubleshooting performance bottlenecks is tough even in a very familiar language and experience with APIs, so this guesswork comes with a huge caveat. With that in mind, I would imagine several possible causes of the performance issue, in the order of importance I would blindly guess without knowing pretty much anything of C#.
1: Your OnReceive code seems to be doing quite a lot of processing. Maybe spending too much time here hurts your ability to receive more incoming data? I see several API calls and some light data manipulation, but I have no idea how expensive this stuff is in C#.
2: Your OnReceive function might be causing GUI events that end up repainting. This is horribly inefficient on any OS, but particularly bad with Windows. Or at least has been in my experience, because Windows seems to do GUI updates synchronously. Maybe C# is newer and Microsort has improved how things are done, but my cynical side has doubts. Ideally, you would want to be sure your code causes GUI events that ultimately lead to a screen repaint to no more than whatever your monitor's vertical refresh rate is. A function like OnReceive could run many thousands of times per second during high speed data flow. But the Windows GUI will struggle to process 120 or even 60 repaint-causing events per second. I see you have a println() call near the end, which I would be suspect. You should really consider how many GUI repaints per second everything you call might cause to happen.
3: Maybe SafeSerialPort adds too much overhead. Perhaps if it's parsing incoming bytes into wide characters and looking for line breaks. That sort of code ought to be fast, but sometimes things designed in these modern environments end up having surprising overhead for things you would imagine doing quickly in native C code. You might need to use (unsafe) SerialPort for more direct access to the WIN32 API.
4: Perhaps all this stuff is being run in an event-based system (designed around Windows GUI) where you're always going to suffer too much overhead or latency? You might need to create a dedicated thread which just receives the incoming data and somehow hands it off to the rest of your program. If #2 is an issue, this is probably where you would gather and pre-process data so you can deliver it in smaller number of larger chunks so you don't risk flooding the GUI with too many expensive repaint-causing events. Ultimately the path to successfully processing high speed data is to do it in large enough chuncks that the fixed overhead of API calls, context switches, function entry/exit, etc... gets amortized over many bytes.
5: C# might just not be up to this task. I suspect this is unlikely, but I can say with certainty it can be done using C / C++ using native WIN32 APIs.
Again, I really don't know anything about C#. But I tried to look at your C# code anyway. Please remember this is based on my experience with C / C++ and native WIN32 APIs. Hopefully it helps?