错误:“;从一个线程访问,而不是在“”上创建的线程;我曾经使用过后台工作人员,现在仍然没有;不起作用

本文关键字:线程 后台 曾经 工作人员 不起作用 一个 访问 错误 创建 | 更新日期: 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();
    }

}