关于backgroundworker(100分!急!在线等)
我想问,我的主窗口拥有一个ArrayList对象,backgroundworker的dowork函数里面可以访问它吗?我的情况是这样的:我在dowork函数里对这个ArrayList做了修改,没有报错,调试看了,也可以成功访问,可是在dowork完了,触发“完成事件”后,我再次访问ArrayList就有exception,说“另一线程拥有此对象”之类的。
我又不知道怎么用vs2008看“另一线程到底是哪个线程”,说的不清不楚的... --------------------编程问答-------------------- 代码贴来看看。 --------------------编程问答-------------------- --------------------编程问答-------------------- 代码!!!! --------------------编程问答-------------------- --------------------编程问答-------------------- CheckForIllegalCrossThreadCalls = false;//允许线程交叉管理
或者是 你直接就把 this 传递过去 将UI线程直接扔过去,,给他绝对的控制权
或者通过 委托 自己写一个方法 将委托扔过去 通过委托来调用方法
3种方法最少有2个应该是可行的,,你可以试下 --------------------编程问答--------------------
代码有点长:
--------------------编程问答-------------------- 不会···
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;//允许线程交叉管理 --------------------编程问答--------------------
这种写法会引起FORM崩溃滴,请使用11楼的做法。
--------------------编程问答-------------------- 关闭线程。 --------------------编程问答--------------------
希望程序不时崩溃的,请使用此方法。。。 --------------------编程问答-------------------- delegate
补充:.NET技术 , C#