4

私は次のコードを持っています:

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()また、抽出が完了したときにメッセージボックス()を表示する方法を知っている人はいますか?

どんな助けでもいただければ幸いです。

4

2 に答える 2

6

TargetInvocationExceptionの原因を知るには、例外のInnerExceptionプロパティを確認する必要があります。

大まかに推測すると、stepの値が正しく計算されていません。100.0/zip.Countである必要があります。同様にダブルである必要があります。したがって、.zipファイルに100を超えるファイルが含まれていると、進行状況が100を超えて増加するリスクがあります。そして、その値をProgressBar.Valueに割り当てると、爆弾が発生します。小さなアーカイブでもプログレスバーが誤動作し、まったく増加しないことに気付くはずです。

このようなとらえどころのないバグをデバッグする良い方法は、デバッグ+例外です。CLR例外の[スロー]チェックボックスをオンにします。例外がスローされると、デバッガーが停止するようになりました。

于 2013-03-25T01:36:52.663 に答える
0
 worker.ProgressChanged += (o, e) =>
    {

//バックグラウンドスレッドからGUI要素を更新しようとしているようで、例外がスローされています。スレッドをGUIスレッドにマーシャリングしてみてください。

progbarExtract.Value = Convert.ToInt32(e.ProgressPercentage);
    };
于 2013-03-25T00:56:11.087 に答える