无法使用C#中的线程更新进度条

时间:2010-11-14 23:26:28

标签: c# progress-bar multithreading

    private void button1_Click(object sender, EventArgs e)
    {
        PROGRESS_BAR.Minimum = 0;
        PROGRESS_BAR.Maximum = 100;
        PROGRESS_BAR.Value = 0;

        for (int i = 0; i < 100; i++)
        {
            Thread t = new Thread(new ThreadStart(updateProgressBar));
            t.IsBackground = true;
            t.Start();
        }

    }

    private void updateProgressBar()
    {   
          PROGRESS_BAR.PerformStep();
          Thread.Sleep(4000);
    }

我总是收到此错误: 跨线程操作无效:控制''从创建它的线程以外的线程访问。

我试图在谷歌搜索解决方案,不幸的是所有这些都不适合我。有没有人知道如何解决这个问题? 提前谢谢..

3 个答案:

答案 0 :(得分:5)

您无法与非UI线程中的UI元素进行交互。 你需要使用像

这样的代码
this.BeginInvoke((Action)(() => PROGRESS_BAR.PerformStep()));

答案 1 :(得分:2)

您应该使用BackgroundWorker component及其ProgressChanged事件。

您可以在ReportProgress处理程序(在后台线程上运行)中调用DoWork方法,然后更新ProgressChanged处理程序中的进度条(在UI线程上运行) )。

如果你真的想自己做(没有BackgroundWorker),你可以致电BeginInvoke

答案 2 :(得分:0)

您的所有UI交互(包括回调,属性集和方法调用)必须位于同一个线程上。

其中一个回调可以启动另一个线程(或许多线程),但它们无法直接更新UI。处理更新的方法是通过数据属性。我的处理线程将更新进度状态属性。这是由UI线程读取的,它具有用于进度条的常规(100ms)更新的计时器。

如果这样做,您将需要锁定用于通信状态更新的任何对象(例如,字符串)。