首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

使用backgroundWorker组件,为什么还会占用主线程,导致卡的现象?解决办法

2012-09-15 
使用backgroundWorker组件,为什么还会占用主线程,导致卡的现象?直接贴代码打断点看的时候,主线程执行完bac

使用backgroundWorker组件,为什么还会占用主线程,导致卡的现象?
直接贴代码
打断点看的时候,主线程执行完backgroundWorker1.RunWorkerAsync();后 断点出了这里-> } 就一直卡着界面,要等OldUpload运行完才有反应

C# code
        private void btnOldUpload_Click(object sender, EventArgs e)        {            backgroundWorker1.RunWorkerAsync();        }           private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)        {             OldUpload();        }        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)        {           if (e.Error != null)                Console.WriteLine("error");            else            {                MSG("上传结束!");            }               }       /**需要长时间执行的方法**/        private void OldUpload()        {            int ucount = dgvUsers.Rows.Count;            int mcount = dgvOldMachines.Rows.Count;            for (int i = 0; i < mcount; i++)//            {                dgvOldMachines.EndEdit();                DataGridViewCheckBoxCell ckoldmachine = (DataGridViewCheckBoxCell)dgvOldMachines.Rows[i].Cells["xuanold"];                Boolean flag = Convert.ToBoolean(ckoldmachine.Value);                if (flag == true)//datagridview 设备选中的信息                {                    int iMachineNumber = Convert.ToInt32(dgvOldMachines.Rows[i].Cells[2].Value.ToString());                    MachineInfo m = MachineInfoBLL.SelectMachineInfoByEqpID(iMachineNumber.ToString());                    for (int j = 0; j < ucount; j++)                    {                        dgvUsers.EndEdit();                        DataGridViewCheckBoxCell checkcell = (DataGridViewCheckBoxCell)dgvUsers.Rows[j].Cells["Column1"];                        Boolean flagm = Convert.ToBoolean(checkcell.Value);                        if (flagm == true)//datagridview人员选中的信息                        {                            try                            {                                int idwEnrollNumber = Convert.ToInt32(dgvUsers.Rows[j].Cells[1].Value.ToString());                                string sName = dgvUsers.Rows[j].Cells[2].Value.ToString();                                if (Connect(axCZKEM1, m.Ip, m.Port, iMachineNumber.ToString(), Convert.ToInt32(m.Commpassword)))                                {                                   // MSG("连接成功!");                                    int idwErrorCode = 0;                                                                        int idwFingerIndex = 0;                                    string sTmpData = "";                                    int iPrivilege = 0;                                    bool bEnabled = true;                                    int iUpdateFlag = 1;                                    string sPassword = "";                                    int iFlag = 1;                                                                       axCZKEM1.EnableDevice(iMachineNumber, false);                                    int iLastEnrollNumber = 0;//判断是否已上传用户信息                                    if (axCZKEM1.BeginBatchUpdate(iMachineNumber, iUpdateFlag))//创建批处理数据的内存空间                                    {                                        List<TempLate> tl = TempLateBLL.GetOldTempLateBySSN(idwEnrollNumber.ToString());//根据考勤号查询新机器指纹信息                                        if (tl.Count != 0)                                        {                                            foreach (TempLate t in tl)                                            {                                                idwFingerIndex = t.Fingerid;                                                sTmpData = t.Template;                                                if (idwEnrollNumber != iLastEnrollNumber)//判断是否已上传用户信息(指纹信息除外)                                                {                                                    if (axCZKEM1.SetUserInfo(iMachineNumber, idwEnrollNumber, sName, sPassword, iPrivilege, bEnabled))//上传用户信息到内存                                                    {                                                        axCZKEM1.SetUserTmpStr(iMachineNumber, idwEnrollNumber, idwFingerIndex, sTmpData);//上传指纹信息到内存                                                       // MSG("上传用户" + idwEnrollNumber.ToString() + "信息成功,指纹ID" + idwFingerIndex + ",指纹长度" + sTmpData.Length + "");                                                    }                                                    else                                                    {                                                        axCZKEM1.GetLastError(ref idwErrorCode);                                                        axCZKEM1.EnableDevice(iMachineNumber, true);                                                                                                             MessageBox.Show("Operation failed,ErrorCode=" + idwErrorCode.ToString(), "Error");                                                        return;                                                    }                                                }                                                else//一个用户拥有多个指纹模板的情况                                                {                                                    axCZKEM1.SetUserTmpStr(iMachineNumber, idwEnrollNumber, idwFingerIndex, sTmpData);//上传指纹模板                                                  //  MSG("上传用户" + idwEnrollNumber.ToString() + "信息成功,指纹ID" + idwFingerIndex + ",指纹长度" + sTmpData.Length + "");                                                }                                                iLastEnrollNumber = idwEnrollNumber;//动态地改变值                                            }                                            axCZKEM1.BatchUpdate(iMachineNumber);//上传所有信息到内存                                            axCZKEM1.RefreshData(iMachineNumber);//机器数据刷新                                                                                    axCZKEM1.EnableDevice(iMachineNumber, true);//启用设备                                        }                                        else                                        {                                           // MSG("数据库里没有数据,请先在线上传指纹!");                                        }                                    }                                }                            }                            catch (Exception ex)                            {                                MessageBox.Show(ex.ToString());                            }                            finally                            {                                axCZKEM1.EnableDevice(iMachineNumber, true);                                axCZKEM1.Disconnect();                            }                        }                    }                }            }        private void MSG(string body)        {             this.BeginInvoke((MethodInvoker)(() =>            {            dgvMessages.Rows.Add(new string[] { (dgvMessages.Rows.Count + 1).ToString(), body, DateTime.Now.ToString() });            dgvMessages.FirstDisplayedScrollingRowIndex = dgvMessages.Rows.Count - 1;            }));        } 



[解决办法]
探讨

很奇怪,在OldUpload的线程里可以访问界面上的控件吗?

热点排行