如何在另一个线程中更新在另一个类中执行的c#进程栏

本文关键字:另一个 进程 执行 更新 线程 | 更新日期: 2023-09-27 18:10:08

我在Windows窗体上工作我想从另一个线程更新进度条这个线程执行另一个类的代码如:

 class form1
  {
         //start thread in this class
        //which are execute second class method
  }
  class second
  {
     //in this class i want to update progress bar
   }

确切地说,我正在处理文件,并在"第二类"中一个接一个地读取文件,如果一个文件的处理完成,那么我想更新进程栏(整个进程在另一个线程中运行,而不是UI线程)。我怎么能做到呢?谢谢你

如何在另一个线程中更新在另一个类中执行的c#进程栏

最好的方法是使用BackgroundWorker对象。这里有一个完整的代码示例来说明如何使用它。

如果做不到这一点,就需要使用Invoke来更新另一个类中的进度条。这将减轻您可能得到的跨线程错误。

如果您想自己执行调用,您可以这样做:

//This goes in your Form1
    private void button1_Click(object sender, EventArgs e)
    {
        Thread t = new Thread(WorkThread);
        t.Start();
    }
    private void WorkThread()
    {
        DoSomeWork w = new DoSomeWork();
        w.Work();
        while (w.progress < 100)
        {
            UpdateFromThread(w.progress);
            Thread.Sleep(100);
        }
    }
    private void UpdateFromThread(int progress)
    {
        if (this.InvokeRequired)
        {
            MethodInvoker MyDelegate = delegate { UpdateFromThread(progress); };
            this.Invoke(MyDelegate);
        }
        else
        {
            progressBar1.Value = progress;
        }
    }
//Class to do some work.
class DoSomeWork
{
    public int progress { get; set; }
    public DoSomeWork()
    {
        progress = 0;
    }
    public void Work()
    {
        Thread t = new Thread(WorkThread);
        t.Start();
    }
    private void WorkThread()
    {
        for (int i = 0; i < 100; i++)
        {
            progress += 1;
            Thread.Sleep(250);
        }
    }
}

你没有具体说明你到底想做什么,但这是一个大致的想法。背景:工人绝对更干净。