C#:如何在创建zip文件时报告进度?

时间:2014-04-10 01:08:36

标签: c# wpf progress-bar dotnetzip

更新:让它工作更新了我的工作代码

这是我到目前为止所拥有的

 private async void ZipIt(string src, string dest)
    {
        await Task.Run(() =>
        {
            using (var zipFile = new ZipFile())
            {
                // add content to zip here 
                zipFile.AddDirectory(src);
                zipFile.SaveProgress +=
                    (o, args) =>
                    {
                        var percentage = (int)(1.0d / args.TotalBytesToTransfer * args.BytesTransferred * 100.0d);
                        // report your progress
                        pbCurrentFile.Dispatcher.Invoke(
                            System.Windows.Threading.DispatcherPriority.Normal,
                            new Action(
                            delegate()
                            {

                                pbCurrentFile.Value = percentage;
                            }
                            ));
                    };
                zipFile.Save(dest);
            }
        });
    }

我需要弄清楚如何更新我的进度条但不确定我是否在正确的轨道上我已经搜索过并找到了很多关于Windows窗体和vb.net的例子但是对于wpf c#什么都不知道是否有人可以提供帮助

1 个答案:

答案 0 :(得分:7)

我猜您使用的是DotNetZip?

您展示的代码中存在许多问题:

  • 您没有在DoWork中致电ReportProgress,那么您希望如何取得进展?
  • 即使您这样做,问题仍然是zip.Save(),您将无法取得进展(除了100%),因为除非完成,否则不会返回。

<强>解决方案

使用任务和SaveProgress事件代替:

private async void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
    await Task.Run(() =>
    {
        using (var zipFile = new ZipFile())
        {
            // add content to zip here 
            zipFile.SaveProgress +=
                (o, args) =>
                {
                    var percentage = (int) (1.0d/args.TotalBytesToTransfer*args.BytesTransferred*100.0d);
                    // report your progress
                };
            zipFile.Save();
        }
    });
}

这样做,您的用户界面就不会冻结,您会定期收到进度报告。

始终首选BackgroundWorker以上的任务,因为现在使用官方方法。