C# BackgroundWorker中的DotNetZip更新进度栏和表单上的标签
我正在创建一个选项,用DotNetZip备份我的应用程序的数据,并且为了避免冻结应用程序,我发现最好的方法是使用BackgroundWorker。所以我带了这样的东西:C# BackgroundWorker中的DotNetZip更新进度栏和表单上的标签,c#,backgroundworker,dotnetzip,C#,Backgroundworker,Dotnetzip,我正在创建一个选项,用DotNetZip备份我的应用程序的数据,并且为了避免冻结应用程序,我发现最好的方法是使用BackgroundWorker。所以我带了这样的东西: private void processButton_Click(object sender, EventArgs e) { BackgroundWorker worker = new BackgroundWorker(); worker.WorkerReportsProgress
private void processButton_Click(object sender, EventArgs e)
{
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
BackupParams bp = new BackupParams();
bp.Source = inputTextBox.Text; // source dir
bp.Output = outputTextBox.Text; // output file
bp.Password = @"Pa$$w0rd";
worker.RunWorkerAsync(bp);
}
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show((string)e.Result, "Zip", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
BackupParams bp = (BackupParams)e.Argument;
string id = Guid.NewGuid().ToString();
comment += "Created at: " + DateTime.Now.ToString() + "\n";
comment += id;
ZipFile zf = new ZipFile();
zf.Comment = comment;
zf.CompressionMethod = CompressionMethod.BZip2;
zf.CompressionLevel = CompressionLevel.BestCompression;
zf.Encryption = EncryptionAlgorithm.WinZipAes256;
zf.Password = bp.Password;
zf.Name = bp.Output;
zf.AddDirectory(bp.Source);
zf.Save();
e.Result = bp.Output;
}
这是BackupParams
public class BackupParams
{
public string Source { get; set; }
public string Output { get; set; }
public string Password { get; set; }
}
现在我被卡住了,因为我想显示添加到存档的文件的进度(带名称的百分比)。最好的方法是什么?我知道我可以使用ZipFile中的那些方法
zf.SaveProgress += zf_SaveProgress;
zf.AddProgress += zf_AddProgress;
但是对于那些我无法访问表单上的progressbar或标签的人…对于从后台工作人员发送进度报告,您可以在
dowwork
方法中使用ReportProgress()
void worker_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker theWorker = (BackgroundWorker)sender;
theWorker.ReportProgress(0, "just starting");
BackupParams bp = (BackupParams)e.Argument;
...
然后触发worker\u ProgressChanged
方法,这样您就可以从那里将报告放入控件中
诀窍是,您必须使用另一个函数来处理zip创建过程中的进度更改。您无法在此访问UI控件,因为它们位于不同的线程上。您应该能够为此创建lambda(我不知道确切的参数,如果我错了,请修复)
我不得不对lambda表达式进行一些修改,以检查
eventArgs.EventType
是否为ZipProgressEventType。在addentry
和ZipProgressEventType之后添加。在writeEntry
之后保存,或者它正在抛出NullReferenceException
@gnur2171 done。现在这个代码对我有效。我有保存进度,并显示已保存文件的名称。正是我想要的。
zf.SaveProgress += (sender, eventArgs) =>
{
// Check if EvenType equals Saving_AfterWriteEntry or NullReferenceException will be thrown
if (eventArgs.EventType == ProgressEventType.Saving_AfterWriteEntry)
{
theWorker.ReportProgress(eventArgs.EntriesSaved, "Saving "+ eventArgs.CurrentEntry.FileName);
}
};
zf.AddProgress += (sender, eventArgs) =>
{
// Check if EventType equals Adding_afterAddEntry or NullReferenceException will be thrown
if (eventArgs.EventType == ZipProgressEventType.Adding_afterAddEntry)
{
theWorker.ReportProgress(eventArgs.EntriesAdded, "Adding "+ eventArgs.CurrentEntry.FileName);
}
};