错误:“;从一个线程访问,而不是在“”上创建的线程;我曾经使用过后台工作人员,现在仍然没有;不起作用
本文关键字:线程 后台 曾经 工作人员 不起作用 一个 访问 错误 创建 | 更新日期: 2023-09-27 18:26:59
我有一个类可以更新GUI上的进度条。我使用了backgroundWorker,两者都带有"DoWork"answers"RunWorkerCompleted",但都给了我相同的错误:
"从上创建的线程以外的线程访问"
我认为通过使用"RunWorkersync()"方法,它可以在GUI线程上运行命令,所以我想我错了。
以下是相关代码(已尝试DoWork和RunWorkerCompleted):
this.backgroundWorker2.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker2_RunWorkerCompleted);
private void backgroundWorker2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
try
{
this.progressBar1.PerformStep();
}
catch (Exception Ex)
{
Program.handleException(Ex, MethodBase.GetCurrentMethod().Name);
}
}
//public access from another class, that's my main problem
//I don't activate the performStep() by pressing a button but its called by progress...
//BTW, the while loop isn't efficient it is temporary..
public void performStep()
{
try
{
this.backgroundWorker2.RunWorkerAsync();
while (this.backgroundWorker2.IsBusy)
{
Console.WriteLine("worker2 is busy");
}
}
catch (Exception Ex)
{
Program.handleException(Ex, MethodBase.GetCurrentMethod().Name);
}
}
有人知道为什么它仍然会出现这个错误吗?(顺便说一句,我试着使用委托,但发现这种方式更方便,而且是MSDN推荐的,所以我想坚持这种方法。)
非常感谢!!
Backgroundworker不在GUI线程上运行命令。它在一个单独的专用线程上运行它们。
要在UI线程上运行,您可以在控件上使用Invoke方法:
private void PerformStep()
{
if (progressBar1.InvokeRequired)
{
progressBar1.Invoke(
new MethodInvoker(() => progressBar1.PerformStep()));
}
else
{
progressBar1.PerformStep();
}
}