BackgroundWorker中调用目标引发的异常

时间:2013-03-25 00:39:02

标签: c# winforms zip backgroundworker dotnetzip

我有以下代码:

public void extractZipFile()
{
    if (!System.IO.Directory.Exists(extractDirectory))
        System.IO.Directory.CreateDirectory(extractDirectory);

    BackgroundWorker worker = new BackgroundWorker();
    worker.WorkerReportsProgress = true;
    worker.ProgressChanged += (o, e) =>
    {
        progbarExtract.Value = Convert.ToInt32(e.ProgressPercentage);
    };

    lblExtracting.Text = "Extracting...";
    worker.DoWork += (o, e) =>
    {
        using (ZipFile zip = ZipFile.Read(zipFile))
        {
            int step = Convert.ToInt32(zip.Count / 100.0); 
            int percentComplete = 0; 
            foreach (ZipEntry file in zip)
            {
                file.Extract(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\XBMC Library Importer\\XBMC_Files", ExtractExistingFileAction.OverwriteSilently);
                    percentComplete += step; //When I comment this out I don't get an exception
                    worker.ReportProgress(percentComplete);
            }
        }
    };

    worker.RunWorkerAsync();
}

我不明白为什么语句percentComplete += step;会导致错误(Exception has been thrown by the target of an invocation.)。

我该如何解决这个问题?

此外,有人知道如何在提取完成后显示消息框(MessageBox.Show())吗?

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:4)

您需要查看异常的InnerException属性以了解TargetInvocationException的原因。

粗略猜测:你错误地计算了的值。它应该是100.0 / zip.Count。也应该是双倍的。因此,当.zip文件包含100个以上的文件时,您可能会将进度增加到100。当你将该值分配给ProgressBar.Value时,这会爆炸。您应该已经注意到进度条在小档案中行为不端,从不增加。

调试像这样的难以捉摸的错误的好方法是Debug + Exception,勾选CLR异常的Thrown复选框。抛出异常时,调试器现在将停止。

答案 1 :(得分:0)

 worker.ProgressChanged += (o, e) =>
    {

//看起来你正在尝试从后台线程更新GUI元素,它正在抛出异常。尝试将线程编组到GUI线程。

progbarExtract.Value = Convert.ToInt32(e.ProgressPercentage);
    };