Как я могу контролировать индикатор выполнения с конвертером времени? - PullRequest
0 голосов
/ 02 октября 2019

Преобразователь видео выполняет процесс. Этот преобразователь выполняет преобразование mp3 в mp4 или другой формат. Я делаю это через форму C #. Я хочу использовать индикатор выполнения, чтобы показать пользователю прогресс процесса. Согласно моим исследованиям, мне пришлось использовать фонового работника. И я использовал, но это не работает. Где моя вина? Код здесь;

  private void BackgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        progressBar1.Value = 0;
        progressBar1.Step = 1;
        for (int i = 0; i < 100; i++)
        {
            Convert();
          //  backgroundWorker1.ReportProgress(i, e.Result);
            progressBar1.PerformStep();
            Application.DoEvents();
            System.Threading.Thread.Sleep(30);
        }
            //   Bitrate();
    }

Пожалуйста, помогите мне?

Управление индикатором выполнения с помощью фонового работника усложнило мой проект после определенного места. В этом случае я решил перейти на асинхронную структуру, я построил архитектуру на асинхронной структуре. Но на этот раз я не знал, как управлять индикатором выполнения при асинхронной структуре. Каковы ваши идеи и мнения по этому вопросу? Async кодирует мое событие кнопки;

но это не сработает? Что я могу сделать?

private void Form1_Load(object sender, EventArgs e)
{ progressBar1.Minimum = 1;
    progressBar1.Maximum = 100;
}
 private async void button3_Click(object sender, EventArgs e)
    {
        progressBar1.Value = 1;
        var progress = new Progress<int>(percent =>
          {
              progressBar1.Value = percent;
          });
         await Convert();

    }

Ответы [ 4 ]

0 голосов
/ 29 октября 2019

Управление индикатором выполнения с помощью фонового работника усложнило мой проект после определенного места. В этом случае я решил перейти на асинхронную структуру, я построил архитектуру на асинхронной структуре. Но на этот раз я не знал, как управлять индикатором выполнения при асинхронной структуре. Каковы ваши идеи и мнения по этому вопросу? Async кодирует событие моей кнопки;

но это не сработает? Что я могу сделать?

  private async void button3_Click(object sender, EventArgs e)
    {
        progressBar1.Value = 1;
        var progress = new Progress<int>(percent =>
          {
              progressBar1.Value = percent;
          });
         await Convert();

    }

 private void Form1_Load(object sender, EventArgs e)
    { progressBar1.Minimum = 1;
        progressBar1.Maximum = 100;
    }
0 голосов
/ 02 октября 2019

Почему вы не используете фоновые рабочие ReportProgress -метод ? Он существует именно для этой цели.

Подпишитесь на ProgressChanged -event и обновляйте оттуда индикатор прогресса.

// Wherever you instanciate your BackgroundWorker
backgroundWorker1.ProgressChanged += (o, e) => progressBar1.Value = e.ProgressPercentage;
// Your DoWork method
private void BackgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    for (int i = 1; i <= 100; i++)
    {
        Convert();
        backgroundWorker1.ReportProgress(i);
    }
    // Bitrate();
}

Поскольку этишаги в процентах, вы также должны установить минимальное и максимальное значение индикатора выполнения. Вы уже установили значение и шаг, но не должны делать это в методе DoWork. Сделайте это где-нибудь еще, например, перед вызовом backgroundWorker1.RunWorkerAsync().
Также обратите внимание, что я сделал цикл for 1-100, так как мы работаем с процентами. Вы также можете сделать 0-99 и сообщить i + 1.

progressBar1.Value = 0;
progressBar1.Step = 1;
progressBar1.Minimum = 0;
progressBar1.Maximum = 100;

Редактировать 1:

Как упомянуто в комментариях, я забыл о возможности создания BackgroundWorker с winformsдизайнер. В этом случае вы должны использовать конструктор вашей Формы (или UserControl), чтобы подписаться на событие ProcessChanged.

Редактировать 2:

Чтобы ответить на дополнительный вопрос о сбросеПосле выполнения работника ProgressBar я покажу вам два возможных решения.

// You can directly subscribe to RunWorkerCompleted using a lambda like before
backgroundWorker1.RunWorkerCompleted += (o, e) => progressBar1.Value = 0;
// Or you can use a method (useful if you have other things to do when the worker is done)
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    progressBar1.Value = 0;
    // some more stuff
}

// Subscribe to RunWorkerCompleted with this method
backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted;

В обоих решениях подписка на RunWorkerCompleted должна быть установлена ​​непосредственно до или после подписки на ProgressChanged(в данном случае это означает, что в конструкторе).

0 голосов
/ 23 октября 2019

по ряду причин;технически я не могу запустить индикатор выполнения как задачу или асинхронно без backgroundworker. Таким образом, какой прогресс я должен сделать на основе времени обработки преобразователя? Спасибо,

0 голосов
/ 02 октября 2019

Попробуйте выполнить progressBar1.PerformStep(); в потоке пользовательского интерфейса, вызвав его, как показано ниже

BeginInvoke((MethodInvoker)delegate
{
    progressBar1.PerformStep();
});

И удалите Application.DoEvents();

...