【问题标题】:unable to update progress bar with threading in C#无法使用 C# 中的线程更新进度条
【发布时间】:2010-11-14 23:26:28
【问题描述】:
    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);
    }

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

我试图在 google 中搜索解决方案,但不幸的是,它们都不适合我。有谁知道如何解决这个问题? 提前谢谢..

【问题讨论】:

  • 一次创建一百个线程是一个可怕的想法。
  • 我只是在测试这个。我还是 C# 新手。
  • 您可能误解了线程。您的代码创建了一百个线程(尝试)同时增加进度条。在他们都(尝试)增加它之后,他们都会睡觉,然后退出。
  • 我正在尝试将它用于其他更“高级”的用途。此外,我将同时使用 5 个线程来处理 1000 多个文档。每当有 1 个线程退出时,我都会调用新的线程来处理新文档。等等。
  • 提示:查看线程池。这样做是为了确保您刚才提到的 onece 任务尽可能快。只需致电ThreadPool.QueueWorkerTask(delegate void())(或类似的东西,只需谷歌.Net ThreadPool 教程或其他东西)。

标签: c# progress-bar multithreading


【解决方案1】:

您无法与来自非 UI 线程的 UI 元素进行交互。 您需要使用类似的代码

this.BeginInvoke((Action)(() => PROGRESS_BAR.PerformStep()));

【讨论】:

  • 现在我收到此错误:错误“System.Windows.Forms.ToolStripProgressBar”不包含“BeginInvoke”的定义,并且没有扩展方法“BeginInvoke”接受“System.Windows”类型的第一个参数.Forms.ToolStripProgressBar' 可以找到(您是否缺少 using 指令或程序集引用?)
  • 您可以在表单本身上调用BeginInvoke
  • 抱歉,只需将 PROGRESS_BAR.BeginInvoke 更改为 this.BeginInvoke
  • 现在我收到此错误:错误无法将 lambda 表达式转换为类型“System.Delegate”,因为它不是委托类型。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    其中一个回调可以启动另一个线程(或多个线程),但它们不能直接更新 UI。处理更新的方法是通过数据属性。我的处理线程将更新进度状态属性。这是 UI 线程读取的宝座,它有一个用于定期(100 毫秒)更新进度条的计时器。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多