如何使用转换器时间控制进度条?
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;
}
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;
}