0

我在提取文件时遇到了一些问题。一切都适用于进度条输出和提取。但是当它运行时,用户界面会冻结。我试过使用Task.Run(),但它并不能很好地与进度条配合使用。或者,也许我只是没有正确使用它。

有什么建议么?

private void unzip(string path)
{
    this.progressBar1.Minimum = 0;
    this.progressBar1.Maximum = 100;
    progressBar1.Value = 0;
    this.progressBar1.Visible = true;
    var sevenZipPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), Environment.Is64BitProcess ? "x64" : "x86", "7z.dll");
    SevenZipBase.SetLibraryPath(sevenZipPath);

    var file = new SevenZipExtractor(path + @"\temp.zip");
    file.Extracting += (sender, args) =>
        {
            this.progressBar1.Value = args.PercentDone; 
        };
    file.ExtractionFinished += (sender, args) =>
        {
            // Do stuff when done
        };


    //Extract the stuff
    file.ExtractArchive(path);
}
4

1 回答 1

2

您可能想要查看Progress<T>.NET Framework 中的对象 - 它简化了跨线程添加进度报告。这是一篇比较好的博客BackgroundWorker文章Task.Run()。看看他Progress<T>Task.Run()示例中是如何使用的。

更新- 这是您的示例的外观。我希望这能给你足够好的理解,以便将来能够使用该Progress<T>类型。:D

private void unzip(string path)
{
    progressBar1.Minimum = 0;
    progressBar1.Maximum = 100;
    progressBar1.Value = 0;
    progressBar1.Visible = true;

    var progressHandler = new Progress<byte>(
        percentDone => progressBar1.Value = percentDone);
    var progress = progressHandler as IProgress<byte>;

    Task.Run(() =>
    {
        var sevenZipPath = Path.Combine(
            Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
            Environment.Is64BitProcess ? "x64" : "x86", "7z.dll");

        SevenZipBase.SetLibraryPath(sevenZipPath);


        var file = new SevenZipExtractor(path);
        file.Extracting += (sender, args) =>
        {
            progress.Report(args.PercentDone);
        };
        file.ExtractionFinished += (sender, args) =>
        {
            // Do stuff when done
        };

        //Extract the stuff
        file.ExtractArchive(Path.GetDirectoryName(path));
    });
}
于 2017-04-10T16:27:39.247 回答