如何使用转换器时间控制进度条?

How do I control progress bar with converter time?

Video Converter 正在执行 process.This 转换器正在执行 mp3 到 mp4 或其他格式的转换。我正在通过 C# Form 执行此操作。我想使用进度条向用户显示进程的进度。根据我的研究,我不得不使用背景工作者。我用过,但它不起作用。我的错在哪里?代码在这里;

  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();
    }

请帮帮我?

用backgroundworker控制进度条,让我的项目过了某个地方就难了。在这种情况下,我决定转向异步结构,我在异步结构上构建了架构。但是这次不知道如何控制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();

    }

尝试通过调用在 UI 线程上执行 progressBar1.PerformStep();,如下所示

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

并删除 Application.DoEvents();

为什么不使用后台工作者ReportProgress-method?它的存在正是为了这个目的。

订阅 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:

正如评论中提到的那样,我忘记了使用 winforms 设计器创建 BackgroundWorker 的可能性。在这种情况下,您应该使用 Form(或 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 的订阅之前或之后(在这种情况下,这意味着在构造函数中)。

出于某些原因;从技术上讲,我不能 运行 进度条用作任务或没有后台工作者的异步。因此,我应该根据转换器处理时间取得什么进展? 谢谢,

用backgroundworker控制进度条,让我的项目过了某个地方就难了。在这种情况下,我决定转向异步结构,我在异步结构上构建了架构。但是这次不知道如何控制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;
    }