C#读多串口,小弟我已经可以读6个串口,但是写入数据库时遇到了有关问题

C#读多串口,我已经可以读6个串口,但是写入数据库时遇到了问题。
我在主线程中已经同时读了读取了6个串口信息。现在怎么写输入数据库呢?我在每一个接收事件中尝试写入数据库,写一个串口没有问题,但是同时写两个时就出差哦。
 private void 启动系统ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //点亮系统运行图标
            toolStripButton1.Image = imageList1.Images[0]; 
            //打开串口
            JZ_RecePort1.openPort();
            JZ_RecePort2.openPort();
            JZ_RecePort3.openPort();
            JZ_RecePort4.openPort();
            LG_RecePort1.openPort();
            LG_RecePort2.openPort();
            // 接收响应时间
            JZ_RecePort1.DataReceived += new Port_Opera.SerialPortDataReceiveEventArgs(JZ_RecePort1_DataReceived_JZ);
            JZ_RecePort2.DataReceived += new Port_Opera.SerialPortDataReceiveEventArgs(JZ_RecePort2_DataReceived_JZ);
            JZ_RecePort3.DataReceived += new Port_Opera.SerialPortDataReceiveEventArgs(JZ_RecePort3_DataReceived_JZ);
            JZ_RecePort4.DataReceived += new Port_Opera.SerialPortDataReceiveEventArgs(JZ_RecePort4_DataReceived_JZ);
            LG_RecePort1.DataReceived += new Port_Opera.SerialPortDataReceiveEventArgs(LG_RecePort1_DataReceived_LG);
            LG_RecePort2.DataReceived += new Port_Opera.SerialPortDataReceiveEventArgs(LG_RecePort2_DataReceived_LG);
        }   
        // 串口COM1---COM6接收数据
        public void JZ_RecePort1_DataReceived_JZ(object sender, SerialDataReceivedEventArgs e, byte[] bits)
        {
           Com_Receive[0]= utility.ByteArrayToBinaryString(bits);
           //写入数据库语句,放在数据库操作类中了
        }
        public void JZ_RecePort2_DataReceived_JZ(object sender, SerialDataReceivedEventArgs e, byte[] bits)
        {
            Com_Receive[1] = utility.ByteArrayToBinaryString(bits);
            
        }
        public void JZ_RecePort3_DataReceived_JZ(object sender, SerialDataReceivedEventArgs e, byte[] bits)
        {
            Com_Receive[2] = utility.ByteArrayToBinaryString(bits);
            
        }
        public void JZ_RecePort4_DataReceived_JZ(object sender, SerialDataReceivedEventArgs e, byte[] bits)
        {
            Com_Receive[3] = utility.ByteArrayToBinaryString(bits);
            
        }
        public void LG_RecePort1_DataReceived_LG(object sender, SerialDataReceivedEventArgs e, byte[] bits)
        {
            Com_Receive[4] = utility.ByteArrayToBinaryString(bits);
        }
        public void LG_RecePort2_DataReceived_LG(object sender, SerialDataReceivedEventArgs e, byte[] bits)
        {
            Com_Receive[5] = utility.ByteArrayToBinaryString(bits);
        }   // 串口COM1---COM6接收数据

大神指定一下!
------解决方案--------------------
1.工控程序需要对多线程进行处理
2.像JZ_RecePort1_DataReceived_JZ这些函数实际上是在后台线程中执行的
3.在后台线程中不要进行访问数据库这样的耗时操作,收到数据后,先写入缓存(就是变量)里面
4.前台线程中,启动一个Timer,,每隔一段时间去读一次缓存
注意:写和读缓存的时候,要用Monitor.Enter和Monitor.Exit同步
------解决方案--------------------
给你个例子吧,根据自己需要改一下  
public class COM
  {
    private SerialPort sp;