CheckForIllegalCrossThreadCalls = false;//允许线程交叉管理
或者是  你直接就把  this 传递过去  将UI线程直接扔过去,,给他绝对的控制权
或者通过 委托 自己写一个方法 将委托扔过去  通过委托来调用方法 3种方法最少有2个应该是可行的,,你可以试下

解决方案 »

  1.   

    代码有点长:        void BWAnalysis_DoWork(object sender, DoWorkEventArgs e)
            {
                BackgroundWorker worker = sender as BackgroundWorker;
                
                //表示获取特征结果的值
                e.Result = GetBmpFeature(worker, e);
            }        //特征分析结束,显示图片
            void BWAnalysis_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                if (e.Error != null)
                    MessageBox.Show(e.Error.Message);
                else if (e.Cancelled)
                {
                    textAnalysis.Text = "特征分析过程终止. . . . . .";
                    btnCancel.IsEnabled = false;
                }
                else 
                {
                    textAnalysis.Text = "完成";                if (null == bmpFeature || 0 == bmpFeature.Count)
                    {
                        MessageBox.Show("特征分析失败,没有检测到人脸。", "操作失败", MessageBoxButton.OK,
                                MessageBoxImage.Information);                    //设置按键为不可用
                        btnLast.IsEnabled = false;
                        btnNext.IsEnabled = false;
                        btnGo.IsEnabled = false;
                        btnOK.IsEnabled = false;
                        btnLeftEye.IsEnabled = false;
                        btnRightEye.IsEnabled = false;
                        btnLeftNaris.IsEnabled = false;
                        btnRightNaris.IsEnabled = false;
                        btnLeftMouth.IsEnabled = false;
                        btnRightMouth.IsEnabled = false;
                    }
                    else
                    {
                        textAnalysis.Text = "test";                    ImageBox.Source = (ImageSource)bmpFeature[0]; //想在这里访问,可是exception说这里“另一线程拥有此对象”
                       
                        if (1 == this.bmpFeature.Count)
                        {
                            this.btnNext.IsEnabled = false;
                        }
                    }  
                }
                btnCancel.IsEnabled = false;            GetCurrentScreen(ref gridGetCurr);
                SetScreenHide(gridGetCurr);
                SetScreenVisible(gridModify);
                stateManager.CurrentState = StateManager.ScreenStates.ScreenModify;
            }
            
            //更新进度条
            void BWAnalysis_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                progressBar.Value = e.ProgressPercentage;
            }        //获取人脸特征
            private void GetBmpFeature(BackgroundWorker worker, DoWorkEventArgs e)
            {
                if (worker.CancellationPending)
                    e.Cancel = true;
                            for (int i = 0; i < picFileNames.Length; i++)
                {
                    fDataPic = manager.GetFeature(picFileNames[i]);
                    if (null == fDataPic)
                        continue;
                    else
                    {
                        Bitmap bmp = this.manager.GetFeaturePicture(fDataPic, picFileNames[i]);
                        bmpFeature.Add(BmpChange(bmp));  //bmpFeature是我所说的UI的成员:ArrayList对象,在这个耗时的函数里做了修改
                        bmp.Dispose();
                    }
                    int percentComplete = (int)((float)i / (float)bmpFeature.Count * 100);
                    if (percentComplete > highestPercentageReached)
                    {
                        this.highestPercentageReached = percentComplete;
                        worker.ReportProgress(percentComplete);
                    }
                }
                           
            }
      

  2.   

    在 BWAnalysis_RunWorkerCompleted中,对UI元素赋值,全部使用类似如下的语法
    label1.Invoke( new MethodInvoker(delegate()
    {
      label1.Text="lalala";
    }));
      

  3.   

    CheckForIllegalCrossThreadCalls = false;//允许线程交叉管理
      

  4.   


    这种写法会引起FORM崩溃滴,请使用11楼的做法。