当前位置:编程学习 > C#/ASP.NET >>

关于backgroundworker(100分!急!在线等)

我想问,我的主窗口拥有一个ArrayList对象,backgroundworker的dowork函数里面可以访问它吗?
我的情况是这样的:我在dowork函数里对这个ArrayList做了修改,没有报错,调试看了,也可以成功访问,可是在dowork完了,触发“完成事件”后,我再次访问ArrayList就有exception,说“另一线程拥有此对象”之类的。
我又不知道怎么用vs2008看“另一线程到底是哪个线程”,说的不清不楚的... --------------------编程问答-------------------- 代码贴来看看。 --------------------编程问答-------------------- --------------------编程问答-------------------- 代码!!!! --------------------编程问答-------------------- --------------------编程问答-------------------- CheckForIllegalCrossThreadCalls = false;//允许线程交叉管理


或者是  你直接就把  this 传递过去  将UI线程直接扔过去,,给他绝对的控制权
或者通过 委托 自己写一个方法 将委托扔过去  通过委托来调用方法 

3种方法最少有2个应该是可行的,,你可以试下 --------------------编程问答--------------------
引用 1 楼 wuyazhe 的回复:
代码贴来看看。

代码有点长:

        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);
                }
            }
                       
        }
--------------------编程问答-------------------- 不会···
帮顶··· --------------------编程问答-------------------- 帮顶  回复内容太短了回复太快,请先休息一下 --------------------编程问答-------------------- 跨线程要Invoke,或者delegate

--------------------编程问答-------------------- --------------------编程问答-------------------- 在 BWAnalysis_RunWorkerCompleted中,对UI元素赋值,全部使用类似如下的语法
label1.Invoke( new MethodInvoker(delegate()
{
  label1.Text="lalala";
})); --------------------编程问答-------------------- CheckForIllegalCrossThreadCalls = false;//允许线程交叉管理 --------------------编程问答--------------------
引用 12 楼 zl850116 的回复:
CheckForIllegalCrossThreadCalls = false;//允许线程交叉管理


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

--------------------编程问答-------------------- 关闭线程。 --------------------编程问答--------------------
引用 12 楼 zl850116 的回复:
CheckForIllegalCrossThreadCalls = false;//允许线程交叉管理


希望程序不时崩溃的,请使用此方法。。。 --------------------编程问答-------------------- delegate
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,