C# 与BackgroundWorker一起工作时,我如何向ProgressBar报告?
我在form1中有一个progressBar1和BackgroundWorker,当我单击按钮创建avi文件时,我希望它根据avi文件创建进度报告给progressBar 这是我创建avi文件的类:C# 与BackgroundWorker一起工作时,我如何向ProgressBar报告?,c#,.net,winforms,C#,.net,Winforms,我在form1中有一个progressBar1和BackgroundWorker,当我单击按钮创建avi文件时,我希望它根据avi文件创建进度报告给progressBar 这是我创建avi文件的类: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using AviFile; using System.Drawin
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AviFile;
using System.Drawing;
using System.IO;
namespace WindowsFormsApplication1
{
class CreateAvi
{
public static void AviMovie(FileInfo[] FileNames)
{
Bitmap bitmap = (Bitmap)Image.FromFile(FileNames[0].FullName);
AviManager aviManager =
new AviManager(@"c:\temp\new.avi", false);
VideoStream aviStream =
aviManager.AddVideoStream(false, 25, bitmap);
int count = 0;
for (int n = 1; n < FileNames.Length; n++)
{
if (FileNames[n].Length > 0)
{
bitmap =
(Bitmap)Bitmap.FromFile(FileNames[n].FullName);
aviStream.AddFrame(bitmap);
bitmap.Dispose();
count++;
}
}
aviManager.Close();
}
}
}
进展:
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
}
已完成:
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
}
这就是我在form1中所做的:
这是CreateAvi类中的方法,我对其进行了更改,因此它也将从form1中获取backgroundworker(称为变量bgw1):
所以progressBar真的达到了100%的结尾。但是,在label19中,我只能看到000101.jpg文件,而在这个idrectory中有167个文件,最后一个是000167.jpg
getallfiles是FileInfo[]
在form1构造函数中,我做了:
var directory = new DirectoryInfo(mainDirectory);
getallfiles = directory.GetFiles("*.jpg");
我看到getallfiles包含167个文件。如何向标签报告正在处理的文件名?使用
这将触发backgroundWorker1\u ProgressChanged
事件,您可以在该事件中安全地更新UI。需要从实际发生进度的方法调用:
public static void AviMovie(FileInfo[] FileNames,BackgroundWorker bgw1)
{
Bitmap bitmap = (Bitmap)Image.FromFile(FileNames[0].FullName);
AviManager aviManager =new AviManager(@"c:\temp\new.avi", false);
VideoStream aviStream =aviManager.AddVideoStream(false, 25, bitmap);
int count = 0;
for (int n = 0; n < FileNames.Length; n++)
{
if (FileNames[n].Length > 0)
{
bitmap =(Bitmap)Bitmap.FromFile(FileNames[n].FullName);
aviStream.AddFrame(bitmap);
bitmap.Dispose();
count++;
int pctDone = count * 100 / FileNames.Length;
bgw1.ReportProgress(pctDone);
}
}
aviManager.Close();
}
您应该将AviMovie()的主体放入bgw_DoWork(),并在主体顶部添加以下行:
FileInfo fileInfo = (FileInfo[])e.Argument;
int steps = fileInfo.Length;
BackgroundWorker bgw = (BackgroundWorker)sender;
在for循环的末尾添加此行:
bgw.ReportProgress((int)(100 / steps) * n, null);
并用以下内容启动worker:
bgw.RunWorkerAsync(FileNames); //FileNames is of course the array
当然还有其他方法,但这可能就是我要做的。您可以在form1上创建一个方法来更新ProgressBar的值(可能是自调用)。然后eigther访问它或重构CreateAviClass,以便它接受该方法的委托,您可以从当时的非静态AviMovie方法调用该委托。编辑:或者只使用DGIBBS建议的Backgroundworker的ReportProgress方法查看我的问题请使用我尝试向标签报告文件名的内容进行更新在我没有显示我在createavi类中更改的内容之前再次提交我的问题我更改了该方法,以便获得Backgroundworker 1。更新标签将起作用正如我在第一次评论中所建议的那样。直接或通过委托访问Form1上的自调用方法。DGibbs查看我的问题,我更新了我到目前为止所做的工作,但它不起作用。您尝试的方式是,只有在完成
AviMovie
之后,才报告进度。好吧,首先,您没有计算百分比值。。。您还需要从AviMovie内部报告进度。您将在操作完成后报告。如何将当前正在处理的每个文件的名称分配给标签?我在backgroundworker progress事件的form1中尝试生成:label9.Text=allfiles[e.ProgressPercentage].FullName;但是,当progressbar达到100%结束时,我只看到文件000101.jpg,目录中的最后一个文件是000167.jpgC-Pound请查看我的questin,请用我尝试向标签报告的文件名更新它。我还看到CreateAvi类中的文件名也包含167个文件。那么为什么我在进度报告中只看到101个文件呢?在我没有显示我在createavi类中更改的内容之前,我再次编辑了我的问题。我更改了方法,因此它将获得backgroundworker1。@user3756594:在回答问题后更改问题可能会使答案无效。我建议只问一个问题,得到一个答案并接受它,然后如果你还有其他问题,单独问(必要时参考原始问题)。
public static void AviMovie(FileInfo[] FileNames,BackgroundWorker bgw1)
{
Bitmap bitmap = (Bitmap)Image.FromFile(FileNames[0].FullName);
AviManager aviManager =new AviManager(@"c:\temp\new.avi", false);
VideoStream aviStream =aviManager.AddVideoStream(false, 25, bitmap);
int count = 0;
for (int n = 0; n < FileNames.Length; n++)
{
if (FileNames[n].Length > 0)
{
bitmap =(Bitmap)Bitmap.FromFile(FileNames[n].FullName);
aviStream.AddFrame(bitmap);
bitmap.Dispose();
count++;
int pctDone = count * 100 / FileNames.Length;
bgw1.ReportProgress(pctDone);
}
}
aviManager.Close();
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) {
progressBar1.Value = e.ProgressPercentage;
int fileIndex = e.ProgressPercentage * FileNames.Length/100;
label9.Text = getallfiles[fileIndex].FullName;
}
FileInfo fileInfo = (FileInfo[])e.Argument;
int steps = fileInfo.Length;
BackgroundWorker bgw = (BackgroundWorker)sender;
bgw.ReportProgress((int)(100 / steps) * n, null);
bgw.RunWorkerAsync(FileNames); //FileNames is of course the array