我已经在这个主题上搜索了几天,但我还没有发现任何看似相关的内容。请记住,我仍在学习如何在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仅采用整数值,如何使用正确的百分比更新进度条?显然,我无法报告&#34; 16.67%&#34;使用ReportProgress。
提前感谢您的时间和建议。
答案 0 :(得分:4)
如果仔细查看可用于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;
}
答案 1 :(得分:0)
...或仅将值报告为(int)(pageNumber * 100 / totalPages)