6

私は C# プログラマーです。

現在、ICSharpCode.SharpZipLib.dllを使用して、現在のプロジェクトで zip ファイルを作成しています。しかし、2 回目にボタンをクリックして zip ファイルを作成する関数を実行すると、アプリケーションは友好的でフレンドリーな例外をスローし、「サイズはゼロですが、 46086を期待していました」と真剣に伝えました。

私はとても混乱しているので、なぜ知りたいのですか?初めてボタンをクリックすると、エラーなく正常に実行できます。

私の関連コードは次のとおりです。

internal void ThreadProc()
{
    try
    {
        ZipHelper.CreateZip(backupZipFile, Constants.HomeConstant, true);

        // do other things
    }

}

CreateZip() 関数の実現は次のとおりです。

public static void CreateZip(string zipFileName, string sourceDirectory, bool recurse)
{
 FastZip zip = new FastZip();

 if (File.Exists(zipFileName))
 {
         File.Delete(zipFileName);
 }

 zip.CreateZip(zipFileName, sourceDirectory, true, "");
}

ここで、再帰呼び出しプロセスを示します。

  1. 「ActiveCheckManager」クラスのメソッド「UpdateAppAsync」を呼び出す
public void UpdateAppAsync(string masterConfig)
{
    this.masterConf = masterConfig;

    Thread actualThread = new Thread(new ThreadStart(UpdateApp));
    actualThread.IsBackground = true;
    actualThread.CurrentCulture = Thread.CurrentThread.CurrentCulture;
    actualThread.CurrentUICulture = Thread.CurrentThread.CurrentUICulture;
    actualThread.Start();
}
  1. UpdateApp 関数を非同期で呼び出します。UpdateApp メソッドでは、単純に UpdateDetail 関数のみを呼び出します。
private void UpdateDetail(string masterConfig, string category)
{
    IUpdate worker = new HP.ActiveCheckLocalMode.UpdateEngine.UpdateManager();
    worker.UpdateApp(masterConf);
}
  1. worker.UpdateApp は UpdateDetail(string, UpdateCategory) のみを呼び出します。
private void UpdateDetail(string masterConfig, UpdateCategory cat)
{
    UpdateThread updateThread = new UpdateThread(this, cat);
    updateThread.MasterConfig = masterConfig;
    updateThread.ThreadProc();
}

それが呼び出しプロセスです。更新ボタンを 2 回クリックすると、例外がスローされます。どうもありがとうございました。

4

1 に答える 1

1

2回目の開始前に、最初のタスクスレッドが終了しましたか?

File.Delete()とSharpZipLibの一部のアイテムが、同じフォルダーを同じファイルに同時にマルチスレッドで圧縮するのにうまく応答しないと想像します。

その「UpdateThreadupdateThread」を「ActiveCheckManager」クラスのプライベートメンバーとしてプロモートし、新しいスレッドを作成する前に、前のクリックからすでに実行されているかどうかを確認します。

于 2010-08-06T08:02:51.317 に答える