c#串口DataReceived触发时好时坏。该如何处理

c#串口DataReceived触发时好时坏。
 private void serialPort_medGasAlm_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            byte[] gasAlmRx  = new byte[200] ;
            System.Threading.Thread.Sleep(150);     //最好是等过100ms等数据完整到达时再处理,如果数据实在是太大,就可以换另一种机制
                
           try 
            { 
                serialPort_medGasAlm.Read(gasAlmRx, 0, serialPort_medGasAlm.BytesToRead );
            //    serialPort_medGasAlm.DiscardInBuffer();
                gasCommFlag=0;
            }
           catch (Exception e1)
           {

               MessageBox.Show(e1.Message, "接收数据异常"); //处理错误

                return;
            }

接收的字节只有5个,每0.5秒发送一次。触发时有时断,有时5、6秒才触发一次,等一下又正常0.5触发一次,是哪出问题?
用串口精灵却能正常接收。
------解决思路----------------------
Sleep 可能会导致数据丢失,最好使用异步回调方式接受并处理  获取到的数据。
或者 使用队列 接受数据,开2个线程,一个线程接受数据;另一个处理队列中的数据。
------解决思路----------------------
DataReceived事件不能有延时,那怕是1ms都有可能造成数据丢失。
如果你想用接收数据的间隔拆分数据,可以使用多线程+读超时方案。
------解决思路----------------------
http://www.bmpj.net/article-1-1.html
[SuperIO概述]工业串口和网络软件通讯平台(SuperIO) 
------解决思路----------------------
肯定是处理慢了,重开一个线程,与主线程分开,用一个while(true)循环接收数据和处理数据