C#为啥总是先执行串口的程序

C#为什么总是先执行串口的程序?
情况是这样的,我编写了一段代码,实现的功能顺序是--显示datagridview--打开串口--发送命令给模块(命令送达的话模块会闪一下)

就这么简单的程序,为什么总是模块在闪,datagridview总是很久才显示,而且显示不完全,类似那种页面卡住.上代码...各位大神帮忙看看.

            biaoji = 0;
            dataGridView1.Visible = true;
            jieshukaoqin.Visible = true;
            string oleDBString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source = F:\visual studio 2010\\Projects\\Graduation Project\\g_pData.mdb";
            OleDbConnection conn = new OleDbConnection(oleDBString);
            conn.Open();
          
            //初始化出勤
            string sql = "update Student set SAttendance='" + "缺勤" +"'";//批量修改SAttendance值
            OleDbCommand ccmd = new OleDbCommand(sql, conn);
            if (ccmd.ExecuteNonQuery() != 0)
            {
                
            }


                //显示学生信息
                string ssql = "select * from Student";
                OleDbDataAdapter ad = new OleDbDataAdapter(ssql, conn);
                DataTable dt = new DataTable();
                ad.Fill(dt);
                dataGridView1.DataSource = dt.DefaultView;

                /******这是刷新DATAGRIDVIEW语句********/
            /*dataGridView1.Refresh();
            dataGridView1.DataSource = dt.DefaultView;*/

                //初始化串口
                string str;
                int count = 0;
                sp = new SerialPort();
                sp.PortName = "COM11";
                sp.BaudRate = 57600;
                sp.StopBits = StopBits.One;
                sp.Parity = Parity.None;
                sp.DataBits = 8;
                sp.Open();
                byte[] buffer = new byte[12];//用于保存普通应答包
                byte[] bbuffer = new byte[16];//用于保存搜索返回的应答包
            //录入指纹图像
                    do
                    {
                        sp.DiscardInBuffer();//清除缓存数据
                        sp.Write(luru, 0, 12);//发送录入指令
                        Thread.Sleep(1000);//延时1秒
                        count = sp.BytesToRead;//读应答包数据
                        sp.Read(buffer, 0, count);//将数据存入buffer
                        Thread.Sleep(1000);//延时1秒