jinesh sam Ответов: 1

Значение индикатора выполнения не обновляется из эталонного решения


Привет Друзья,

У меня есть форма windows, которая ссылается на внешнюю библиотеку DLL. Я обращаюсь к одному из общедоступных методов, который предоставляет DLL. Конкретный метод - это большой прогресс, и его статус должен быть указан в индикаторе прогресса. DLL также имеет общедоступную статическую переменную,которая дает статус прогресса. меня беспокоит то, что он не отображается в пользовательском интерфейсе. отображается только конечное значение (100%).

Пример кода приведен ниже
Пожалуйста, помогите определить, где все идет не так.

DLL-код
       public static void ProgressBarTest()
        {
            for (int i = 0; i < 100; i++)
            {
                // Wait 100 milliseconds.
                Thread.Sleep(100);
                // Report progress.
                TestSettings.ProgressValue = i;
            }
        }
public class TestSettings
    {
   public static int ProgressValue { get; set; }
     }


Что я уже пробовал:

private void button1_Click(object sender, EventArgs e)
        {
            // Start the BackgroundWorker.
            //  backgroundWorker1.RunWorkerAsync();
            timer1.Enabled = true;          
            RetirementPlan.MainMethods.ProgressBarTest(); 
}


использование таймера
private void timer1_Tick(object sender, EventArgs e)
       {
           progressBar1.Minimum = 0;
           progressBar1.Maximum = 100;
           progressBar1.Value = 10;
           if (progressBar1.Value == progressBar1.Maximum)
           {
              // timer1.Stop();
               timer1.Enabled = false;
               progressBar1.Value = 0;
               progressBar1.Enabled = false;
           }
           progressBar1.Value = RetirementPlan.Utils.TestSettings.ProgressValue;
           double percentage = ((double)progressBar1.Value / (double)progressBar1.Maximum) * 100;
           lblProg.Text = "Current progress: " + percentage.ToString() + "%";
       }


Фоновый Работник
    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
      {
          // Change the value of the ProgressBar to the BackgroundWorker progress.
          progressBar1.Value = e.ProgressPercentage;
          // Set the text.
          this.Text = e.ProgressPercentage.ToString();
      }
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
      {
          backgroundWorker1.ReportProgress(RetirementPlan.Utils.TestSettings.ProgressValue);
      }

1 Ответов

Рейтинг:
2

Richard Deeming

Ваш ProgressBarTest метод никогда не теряет контроля. Поток пользовательского интерфейса блокируется до тех пор, пока метод не вернется, поэтому вы всегда видите только конечное значение, а не промежуточные значения.

Если вы хотите использовать BackgroundWorker, то вам нужно сделать работу в DoWork обработчик событий:

private void button1_Click(object sender, EventArgs e)
{
    backgroundWorker1.RunWorkerAsync();
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    for (int i = 0; i < 100; i++)
    {
        Thread.Sleep(100);
        backgroundWorker1.ReportProgress(i);
    }
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressBar1.Value = e.ProgressPercentage;
    lblProg.Text = "Current progress: " + e.ProgressPercentage + "%";
}


Если вы хотите использовать таймер, то вам нужно выполнить работу в фоновом потоке или таким образом, чтобы дать контроль потоку пользовательского интерфейса. Самым простым вариантом, вероятно, был бы async метод:
public static async Task ProgressBarTestAsync()
{
    for (int i = 0; i < 100; i++)
    {
        await Task.Delay(100);
        TestSettings.ProgressValue = i;
    }
}
...
private async void button1_Click(object sender, EventArgs e)
{
    progressBar1.Minimum = 0;
    progressBar1.Maximum = 100;
    progressBar1.Value = 0;
    progressBar1.Enabled = true;
    timer1.Enabled = true;
    
    await RetirementPlan.MainMethods.ProgressBarTestAsync(); 
    
    timer1.Enabled = false;
    progressBar1.Value = 0;
    progressBar1.Enabled = false;
}

private void timer1_Tick(object sender, EventArgs e)
{
    progressBar1.Value = RetirementPlan.Utils.TestSettings.ProgressValue;
    double percentage = ((double)progressBar1.Value / (double)progressBar1.Maximum) * 100;
    lblProg.Text = "Current progress: " + percentage + "%";
}


jinesh sam

Метод таймера работает для меня. Спасибо :)