gpt4 book ai didi

C# - 使用 BackgroundWorker.ReportProgress 以自定义最大值更新 ProgressBar

转载 作者:行者123 更新时间:2023-11-30 20:37:31 25 4
gpt4 key购买 nike

我已经就这个主题搜索了几天,但没有找到任何相关的内容。请记住,我仍在学习如何在 C# 中使用 BackgroundWorker 和多线程。

我在使用 ReportProgress 方法时遇到问题。这是我正在做的事情的一个小例子。

private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
if (!backgroundWorker1.CancellationPending)
{
// bunch of code for handling a multiple-page PDF file using Ghostscript.NET
for (var pageNumber = 1; pageNumber <= pageCount; pageNumber++)
{
if (!backgroundWorker1.CancellationPending)
{
// get file path and file name, convert page to image file
// after converting page to image file do:
backgroundWorker1.ReportProgress(pageNumber); // Here is the problem
}
else
e.Cancel = true;
...
}
}
}

private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}

我遇到的问题是我想为用户提供一个进度条,它会在文件转换时更新进度,这样 UI 就不会变得无响应。进度条的最大值属性设置为 100,但显然每个 PDF 文件不会是 100 页 - 上面的代码只报告每个单独页面的 progressPercent 值 - 所以如果 PDF 不是,进度条只会部分填充100 页。

所以这是我的问题:如何使用 ReportProgress 方法适本地更新进度条?我通过在报告进度之前设置最大值(通过在 DoWork 中使用 Invoke)让程序更早地工作。但是,我最近了解到您不应该使用 BackgroundWorker 的 DoWork 事件更新 UI(仍在研究)。那么如果 ReportProgress 只取一个整数值,我该如何用正确的百分比更新进度条呢?显然,我不能使用 ReportProgress 报告“16.67%”。

提前感谢您的时间和建议。

最佳答案

如果您仔细查看 ReportProgress 的可用签名方法,您会注意到除了已完成工作的百分比之外,还有一个重载允许传递您自己的对象。
第二个参数可以是引用类型的一个实例,但它也可以是一个简单的整数值,例如当前 PDF 的页数。

作为第二个参数传递给 ReportProgress 的值可以在事件处理程序中检索为 ProgressChangedEventArgs.UserState 的值属性

因此您可以在 DoWork 方法中开始循环之前使用它来传递 pageCount 变量以及 ProgressPercentage 值的常规值 -1

private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
if (!backgroundWorker1.CancellationPending)
{

int pageCount = CalculatePageCount();
backgroundWorker1.ReportProgress(-1, pageCount);
for (var pageNumber = 1; pageNumber <= pageCount; pageNumber++)
.....

}
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// First call, the percentage is negative to signal that UserState
// contains the number of pages we loop on....
if(e.ProgressPercentage == -1)
progressBar1.Maximum = Convert.ToInt32(e.UserState);
else
progressBar1.Value = e.ProgressPercentage;
}

关于C# - 使用 BackgroundWorker.ReportProgress 以自定义最大值更新 ProgressBar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35968886/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com