6

我是一名 C# 程序员。

现在,我正在使用ICSharpCode.SharpZipLib.dll在我当前的项目中创建一个 zip 文件。但是我突然想到,当我在第二次点击按钮执行创建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();
}

那就是调用过程。当我第二次点击更新按钮时,它会抛出异常,你能帮帮我吗?非常感谢。

4

1 回答 1

1

第一个任务线程是否在您第二次开始之前完成?

我想 File.Delete() 和 SharpZipLib 中的某些项目不能很好地响应多线程同时将同一个文件夹压缩到同一个文件。

将该“UpdateThread updateThread”提升为“ActiveCheckManager”类的私有成员,然后在创建新线程之前检查它是否已经从先前的单击中运行。

于 2010-08-06T08:02:51.317 回答