现在我要使用backgroundworker多线程控件将数据放入接口中(注:只能使用这种多线程方法),接口返回true或false,如果是false则将数据插入到界面的listview中,新手高分求大神解决,在线等!请将backgroundworker的三个方法具体该放哪些操作详细说明!跪谢!

解决方案 »

  1.   

    希望对你有帮助
    http://www.cnblogs.com/tom-tong/archive/2012/02/22/2363965.html
      

  2.   

    RunWorkerAsync()
        开始后台运行执行,该函数后将触发bgw.DoWorker事件,需要执行的操作写在DoWorker事件响应函数里,该函数也可以加参数,参数从DoWorker事件处理函数的e.Arguement里获取
     
    CancelAsync()
        申请后台程序停止,注意该函数不能实际停止后台程序,只能将bgw的CancellationPending 值设为true,需要自己在后台运行的程序中判断这一值,进而停止后台程序的运行.
        注意本方法使用前,需要将bgw的WorkerSupportsCancellation 值设为true,否则将不起作用.
     
    ReportProgress()
        在后台程序中调用,向主线程传送进度信息,可以带一个或两个参数,一个为INT类型的进度(0~100),一个为自定义类型的参数,可以传任意信息.
        调用后,将触发bgw.ProgressChanged事件,可以将界面变化的代码写在该事件响应函数中,之前提到的两个参数均可从bgw.ProgressChanged事件响应函数的参数e中获取,分别为e.ProgressPercentage和e.UserState.    
        注意本方法使用前,需要将bgw的WorkerReportsProgress值设为true,否则将不会触发事件.
      

  3.   

    既然不清楚,那我直接上代码 
    //这一段是用DoWork操作数据读取,将读取到的数据扔给下面的checkRead()方法;
    private void connectWorker_DoWork(object sender, DoWorkEventArgs connectEvent)
            {
                if (m_IsConnected)
                {
                    Symbol.RFID3.TagData[] tagData = m_ReaderAPI.Actions.GetReadTags(1000);
                    if (tagData != null)
                    {
                        for (int nIndex = 0; nIndex < tagData.Length; nIndex++)
                        {
                            if (tagData[nIndex].OpCode == ACCESS_OPERATION_CODE.ACCESS_OPERATION_NONE ||
                                (tagData[nIndex].OpCode == ACCESS_OPERATION_CODE.ACCESS_OPERATION_READ &&
                                tagData[nIndex].OpStatus == ACCESS_OPERATION_STATUS.ACCESS_SUCCESS))
                            {
                                Symbol.RFID3.TagData tag = tagData[nIndex];
                                tagID = tag.TagID;
                                checkRead(tagID);
                            }
                        }
                    }
                }
            }
     //调用接口
            private void checkRead(string epc_code)
            {
                try
                {
                    string err = string.Empty;                bool ret = false;
                    SmartLinkWS smart = new SmartLinkWS();
                    ret = smart.Check_SF_IsAlarm(epc_code, GlobalVar.localPara.DeviceNo, ref err);
                    if (ret == false)
                    {
                        return;
                    }                else
                    {
                        //如果为flase 先循环列表有没有,如果有,比对时间是否在10秒内
                        if (inventoryList.Items.Count > 0)
                        {
                            bool flag = false;                        for (int i = 0; i < inventoryList.Items.Count; i++)
                            {
                                string temp = inventoryList.Items[i].SubItems[0].Text;
                                if (epc_code == temp) //如果有
                                {
                                    flag = true;
                                    string epctime = inventoryList.Items[i].SubItems[1].Text;
                                    DateTime time1 = Convert.ToDateTime(epctime);                                TimeSpan ts = DateTime.Now - time1;
                                    if (Convert.ToInt32(ts.TotalSeconds) > 10) //判断时间是否大于10秒  是报警
                                    {
                                        m_ReaderAPI.Config.GPO[2].PortState = GPOs.GPO_PORT_STATE.TRUE;
                                        m_ReaderAPI.Config.GPO[2].PortState = GPOs.GPO_PORT_STATE.FALSE;
                                    }                                break;
                                }
                            }                        if (flag == false)
                            {
                                m_ReaderAPI.Config.GPO[2].PortState = GPOs.GPO_PORT_STATE.TRUE;
                                m_ReaderAPI.Config.GPO[2].PortState = GPOs.GPO_PORT_STATE.FALSE;                            ListViewItem item = new ListViewItem(epc_code);                            //加入扫描时间
                                item.SubItems.Add(DateTime.Now.ToString());                            //加入扫描机器号
                                item.SubItems.Add(txtNo.Text);                                                        inventoryList.Items.Add(item);                            ////刷新列表
                                //inventoryList.BeginUpdate();
                                ////停止刷新列表
                                //inventoryList.EndUpdate();
                            }
                            //MessageBox.Show("OK1");
                        }                    else
                        {
                            m_ReaderAPI.Config.GPO[2].PortState = GPOs.GPO_PORT_STATE.TRUE;
                            m_ReaderAPI.Config.GPO[2].PortState = GPOs.GPO_PORT_STATE.FALSE;                        ListViewItem item = new ListViewItem(epc_code);
                            //加入扫描时间
                            item.SubItems.Add(DateTime.Now.ToString());                        //加入扫描机器号
                            item.SubItems.Add(txtNo.Text);
                            inventoryList.Items.Add(item);
                            //MessageBox.Show("OK");                        ////刷新列表
                            ////inventoryList.BeginUpdate();
                            ////停止刷新列表
                            ////inventoryList.EndUpdate();
                        }
    现在的问题是在往listview里面插入数据时会出现异常:
      

  4.   

    这是因为跨线程访问了inventoryList了.
    提示信息已经说明了.
      

  5.   

    可以先对inventoryList进行访问判断,如果不行再Invoke调用:
    if (inventoryList.IsAccessible)
                        Do something;
                    else
                    {
                        inventoryList.Invoke(new ThreadStart(delegate()
                        {                
                            Do something;
                        }));
                    }
    ,搂主给分呀
      

  6.   

    将inventoryList.IsAccessible替换成inventoryList.InvokeRequired.
      

  7.   

    dowork里做异步的事情,不能访问ui控件。
    process里处理进度条问题。
    complete里做完成的操作。可以访问ui控件。
      

  8.   

    我的问题是backgroundworker多线程,为什么给我弄个委托线程出来呢?我现在已经用backgroundworker线程搞定了。
      

  9.   

    在线程中是不能访问控件,可以调用控件的Invoke方法this.Invoke(new MethodInvoker(delegate
                {                this.Text= "Hello World!";  //this 为Form窗体
                    
                }));